提问者:小点点

NodeJS nedb函数未等待


函数checkexist执行时间过长。尝试使用await异步函数,但没有效果。var exists=await checkExists(data.email);返回未定义,因为不等待checkExists

我有我的index.js:

const express = require('express');
const app = express();

require('./private/signUpAPI')(app);

app.listen(80, () => console.log('listening on 80'));
app.use(express.static('public'));
app.use(express.json({limit: '1mb'}));

和我的signupapi.js:

const DataStore = require('nedb');
const express = require('express');

const database = new DataStore('private/database.db');
database.loadDatabase();

module.exports = function api(app){
    app.use(express.json({limit: '1mb'}));
    app.post('/signUpAPI', async (request, response) => {
        console.log("Sign Up Request received!");
        const data = request.body;

        var exists = await checkExists(data.email);

        console.log(exists)
        console.log(data);
        console.log("Added to DB");
        console.log('-------------------------' + '\n');
        database.insert(data);
        const testData = {"status": "success"};
        response.send(testData);
    });    
}

async function checkExists(email){
    var exists = false;

    database.find({"email": email}, async function(err, docs){
        if (docs.length > 0){exists = true;}
        console.log(docs.length);
        return exists;
    });
}

这是运行index.js并调用提取('/signupapi')时的节点输出:

Sign Up Request received!
undefined
{
  email: 'a',
  username: 'a',
  hashPass: 'da180265625ebeaf62f4ee1813bdc28faeaf79f0b2b329290758a1c095111ae8',
  salt: 'g8VkTBV$+Bh35K9ns7Zt*9^CH#M=VELSzKUX=H3^+5kpFV=bEbVfXFtF*GGYHOa#'
}
Added to DB
-------------------------

37

我当前在DB中有37个具有相同数据的条目,因此console.log(docs.lengts)返回37。

但这是最后执行的,并且出现在控制台的底部,而它应该出现在顶部。


共2个答案

匿名用户

使用https://www.npmjs.com/package/nedb-promise

所以您可以使用await for数据库查询,并且可以像这样更改代码-

async function checkExists(email) {
    const record = await database.findOne({ email });
    console.log(record);
    if (record) return true;
    return false;
}

匿名用户

您要等待的函数应该返回一个承诺,以便等待响应。如果操作结果是成功,您可以解决承诺,或者拒绝有错误的承诺。

流应该喜欢这样的东西;

async function func1()
{
    try
    {
        var tmp = await func2();
        console.log(tmp);
    }
    catch(err)
    {
        console.log(err);
    } 
}

async funcion func2()
{
    return new Promise(async function (resolve, reject)
    {
        if(true)
        {
            resolve("success");
        }
        else
        {
            reject("error");
        }
    });
}