无法使用 node.js 和 mongodb 以同步方式调用函数
Unable to call the functions in synchronous way using node.js and mongodb
我正在尝试使用 node.js 调用 synchronously
中的某个函数,但根据我的代码,它没有发生。我在下面解释我的代码。
viewDraggedFileContent = async(req, res) => {
try{
let id = req.params.id;
if(!id) {
responseObj = {
status: 'error',
msg: 'Please send the mongo id to fetch the file content.',
body: {}
};
res.send(responseObj);
}else{
let response = await findOne(id, 'useCaseFile');
console.log('res', response);
if(response['status'] === 0) {
responseObj = {
status: 'error',
msg: `Error occurred`,
body: response['data']
};
res.send(responseObj);
}else{
const resObj = [{
fileData: response.data.fileData,
_id: response['data']['_id']
}]
responseObj = {
status: 'success',
msg: `Fetched data successfully`,
body: resObj
};
res.send(responseObj);
}
}
}catch(error) {
console.log('Error::', error);
}
}
/**
* 1- Method to fetch single record from mongoDB as per _id.
*/
findOne = async (id, collName) => {
try{
let mongoID = new ObjectId(id);
MongoClient.connect(dbUrl, dbOptions).then(function (client) {
let connObj = client.db(dbName);
connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
if (error) {
client.close();
return {
status: 0,
data: error
};
} else {
client.close();
return {
status: 1,
data: doc
};
}
})
})
}catch(error){
console.log('Error while fetching single record::', error);
}
}
这里我从 viewDraggedFileContent
函数调用 findOne
函数。我的 objective 是一旦所需的数据将从 findOne
函数 return 然后 console.log('res', response);
应该执行,但根据我的代码 console.log('res', response);
在从 [= 获得响应之前执行14=]。我也用过 async---await
但仍然是 运行 asynchronously
。在这里,我需要从 findOne
函数获得响应后,控制台消息应该显示。
我认为你的问题是你没有 return 承诺,所以调用你的 findOne 函数的行不会等待任何东西。
这里有两个解决方案:
当您将回调传递给 db.collection.findOne 函数时,它不会 return 任何东西,但如果您不这样做,您可以等待结果,如下所示:
const doc = await connObj.collection(collName).findOne({ _id: mongoID })
然后,您可以解析您的文档并return它。
另一个解决方案是 return 在您的 findOne 函数中承诺,然后发送带有 resolve 的结果,如下所示:
findOne = async (id, collName) => {
return new Promise((resolve, reject) => {
try{
let mongoID = new ObjectId(id);
MongoClient.connect(dbUrl, dbOptions).then(function (client) {
let connObj = client.db(dbName);
connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
if (error) {
client.close();
reject(error);
} else {
client.close();
resolve(doc);
}
})
})
}catch(error){
console.log('Error while fetching single record::', error);
}
}
}
然后,您不再需要状态,可以使用 then 和 catch 来获取结果。
你可以在findOne函数中使用async/await
async function findOne(id, collName) {
const client = await MongoClient.connect(url, {
useUnifiedTopology: true,
}).catch((err) => {
console.log("Error while connecting to db", err);
});
if (client) {
try {
let mongoID = new ObjectId(id);
let connObj = client.db(dbName);
let doc = await connObj.collection(collName).findOne({ _id: mongoID });
return {
status: 1,
data: doc,
};
} catch (error) {
console.log("Error while fetching single record::", error);
return {
status: 0,
data: error,
};
} finally {
client.close();
}
}
}
我正在尝试使用 node.js 调用 synchronously
中的某个函数,但根据我的代码,它没有发生。我在下面解释我的代码。
viewDraggedFileContent = async(req, res) => {
try{
let id = req.params.id;
if(!id) {
responseObj = {
status: 'error',
msg: 'Please send the mongo id to fetch the file content.',
body: {}
};
res.send(responseObj);
}else{
let response = await findOne(id, 'useCaseFile');
console.log('res', response);
if(response['status'] === 0) {
responseObj = {
status: 'error',
msg: `Error occurred`,
body: response['data']
};
res.send(responseObj);
}else{
const resObj = [{
fileData: response.data.fileData,
_id: response['data']['_id']
}]
responseObj = {
status: 'success',
msg: `Fetched data successfully`,
body: resObj
};
res.send(responseObj);
}
}
}catch(error) {
console.log('Error::', error);
}
}
/**
* 1- Method to fetch single record from mongoDB as per _id.
*/
findOne = async (id, collName) => {
try{
let mongoID = new ObjectId(id);
MongoClient.connect(dbUrl, dbOptions).then(function (client) {
let connObj = client.db(dbName);
connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
if (error) {
client.close();
return {
status: 0,
data: error
};
} else {
client.close();
return {
status: 1,
data: doc
};
}
})
})
}catch(error){
console.log('Error while fetching single record::', error);
}
}
这里我从 viewDraggedFileContent
函数调用 findOne
函数。我的 objective 是一旦所需的数据将从 findOne
函数 return 然后 console.log('res', response);
应该执行,但根据我的代码 console.log('res', response);
在从 [= 获得响应之前执行14=]。我也用过 async---await
但仍然是 运行 asynchronously
。在这里,我需要从 findOne
函数获得响应后,控制台消息应该显示。
我认为你的问题是你没有 return 承诺,所以调用你的 findOne 函数的行不会等待任何东西。
这里有两个解决方案:
当您将回调传递给 db.collection.findOne 函数时,它不会 return 任何东西,但如果您不这样做,您可以等待结果,如下所示:
const doc = await connObj.collection(collName).findOne({ _id: mongoID })
然后,您可以解析您的文档并return它。
另一个解决方案是 return 在您的 findOne 函数中承诺,然后发送带有 resolve 的结果,如下所示:
findOne = async (id, collName) => {
return new Promise((resolve, reject) => {
try{
let mongoID = new ObjectId(id);
MongoClient.connect(dbUrl, dbOptions).then(function (client) {
let connObj = client.db(dbName);
connObj.collection(collName).findOne({ _id: mongoID }, function (error, doc) {
if (error) {
client.close();
reject(error);
} else {
client.close();
resolve(doc);
}
})
})
}catch(error){
console.log('Error while fetching single record::', error);
}
}
}
然后,您不再需要状态,可以使用 then 和 catch 来获取结果。
你可以在findOne函数中使用async/await
async function findOne(id, collName) {
const client = await MongoClient.connect(url, {
useUnifiedTopology: true,
}).catch((err) => {
console.log("Error while connecting to db", err);
});
if (client) {
try {
let mongoID = new ObjectId(id);
let connObj = client.db(dbName);
let doc = await connObj.collection(collName).findOne({ _id: mongoID });
return {
status: 1,
data: doc,
};
} catch (error) {
console.log("Error while fetching single record::", error);
return {
status: 0,
data: error,
};
} finally {
client.close();
}
}
}