我想在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
我尝试使用await
和var 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时会得到“未定义”。
答案 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)
。