如何修复异步功能中的[object Promise]?

时间:2019-04-05 11:35:41

标签: javascript node.js mongodb

我想在NodeJS的Mongo数据库中获取插入文档的_id。

首先,我调用插入文档的函数

// First Function
router.post('/add', function(req, res) {
  var db = req.db;
    var collection = db.get('entrys');

    var id = databaseAPI.createRecord(req, req.body.name);
    console.log("Finished " + id)
});

我将id中的第二个函数的返回值保存在//Second Function createRecord: async function(req, name) { var db = req.db; var collection = db.get('entrys'); var objectToInsert = { Name: name }; collection.insert(objectToInsert, function(err){ if (err) { return null; console.log("err"); } // Object inserted successfully. console.log(objectToInsert._id) // This returns the ID return objectToInsert._id; // This should return the ID to the first function but I get [object Promise] 中,但是在登录时,我得到了[object Promise]

在另一个.js文件中插入函数:

async

我尝试使用awaitvar id = await databaseAPI.createRecord(req, req.body.name)来解决问题Promise is returning [object Promise]的第一个答案,但是如果这样做,我会得到“未定义”而不是“ [对象承诺]”

我刚接触JavaScript。也许有人可以指出我正确的方向。

编辑:

如果我console.log

我收到“ SyntaxError:await仅在异步函数中有效”

现在,如果我使函数异步,则在import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.regex.*; import java.util.stream.LongStream; public class Solution { // Complete the miniMaxSum function below. static void miniMaxSum(int[] arr) { long[] longs = Arrays.stream(arr).asLongStream().toArray(); Arrays.sort(longs); long sum = LongStream.of(longs).sum(); long min = sum - longs[4]; long max = sum - longs[0]; System.out.println(min + " " + max); } private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int[] arr = new int[5]; String[] arrItems = scanner.nextLine().split(" "); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); for (int i = 0; i < 5; i++) { int arrItem = Integer.parseInt(arrItems[i]); arr[i] = arrItem; } miniMaxSum(arr); scanner.close(); } } id时会得到“未定义”。

2 个答案:

答案 0 :(得分:4)

尝试一下:

// First Function
router.post('/add', async function(req, res) {
  var db = req.db;
    var collection = db.get('entrys');

    var id = await databaseAPI.createRecord(req, req.body.name);
    console.log("Finished " + id)
});

基本上,您需要首先以.createRecord来调用await。要使工作正常进行,您需要制作后处理程序async,因为await仅可在async函数中使用。

答案 1 :(得分:3)

首先,您应该重写第一个类似这样的功能(如@MrfksIV所建议),但是要使用Try-catch块,这样您就可以看到错误:

router.post('/add', async function(req, res) {
  var db = req.db;
  var collection = db.get('entrys');

  try {
    var id = await databaseAPI.createRecord(req, req.body.name);
    console.log("Finished " + id)
  } catch(e) {
    console.log("Err: " + err);
  }
});

关于第二个函数,您在该函数中不返回任何内容,这就是为什么您未定义的原因。而且,在回调中,您期望objectToInsert将被collection.insert方法修改,这是极不可能的。此方法可能会将插入的对象传递给回调。 因此,我想您应该重写第二个函数以使用回调,如下所示:

//Second Function
createRecord: function(req, name) {
  var db = req.db;
  var collection = db.get('entrys');
  var objectToInsert = {
    Name: name
  };

  return new Promise(function(resolve, reject) {
    collection.insert(objectToInsert, function(err, insertedObj){
      if (err) {
        console.log("err");
        reject(err)
      } else {
        console.log(insertedObj);
        resolve(insertedObj._id);
      }
    });
  });
}

mongoose callbacks遵循模式function(err, data)