0

我正在尝试将变量初始化为函数x返回的值showData。这是我的代码:

app.post("/view/show", (req,res) => {
    let x = showData(req.body.custmerName);
    console.log(x);
}

这是showData功能:

const showData = (custName) => {
    const customer = mongoose.model(custName ,collectionSchema,custName);
    customer.find( (error,data) => {
        if (error){
            console.log(error);
        }else{
            return data;  
        }
    });
}

但是,控制台显示undefined. 如果我添加console.log(data)showData函数中,我可以看到我能够成功地从数据库中获取数据。

我知道由于 JavaScript 的同步属性,console.log(x)它不等待执行。showData()如何从函数中获取值并将其记录到控制台,而不是获取undefined

4

3 回答 3

1

在处理异步函数时,您可以使用 async/await 或回调。

app.post("/view/show", (req,res) => {
  showData(req.body.custmerName, (err, res) => {
    const x = res;
    console.log(x);
  });
});

const showData = (custName, callback) => {
  const customer = mongoose.model(custName ,collectionSchema,custName);
  customer.find(callback);
}

于 2020-10-27T17:53:18.527 回答
0

我以前实际上没有使用过 Mongoose,但是查看文档,似乎没有一个 find 函数的版本只需要一个回调函数。

也尝试传递查询对象(在您的情况下,一个空对象就足够了):

customer.find({}, (error,data) => {
    if (error) {
        console.log(error);
    } else {
        return data;  
    }
});

从文档:

// find all documents
await MyModel.find({});

// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();

// executes, passing results to callback
MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {});

// executes, name LIKE john and only selecting the "name" and "friends" fields
await MyModel.find({ name: /john/i }, 'name friends').exec();

// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec();
于 2020-10-27T17:58:47.773 回答
-1

你需要一个异步函数来做到这一点。请执行下列操作:

app.post("/view/show", async(req,res) => {
    let x = await showData(req.body.custmerName);
    console.log(x);
}
于 2020-10-27T17:50:31.413 回答