在以下NodeJS API中,将PostgreSQL数据库插入多行,然后需要发送响应主体。由于在多种情况下可能会出现错误,因此我需要使用消息代码来设置响应主体,以帮助识别可能的原因。因此,我正在使用一个resp
对象,该对象将持有一个code
键以用于消息代码。该对象将在状态为200
(成功)或500
(错误)的HTTP响应中发送。
但是,我总是收到一个空的响应正文。可变范围可以吗?
router.post('/', function (req, res, next) {
rdbmsPool.connect((err, client, release) => {
if (err) {
var resp = {
'Request-Id' : req.get('X-Request-Id'),
'code' : 'code'
}
res.status(500)
res.send(resp)
} else {
var resp = {}
for (k in someArray) {
client.query(queryString, colValues, (err, result) => {
if (err) {
resp = {
'Request-Id' : req.get('X-Request-Id'),
'code' : 'code'
}
res.status(500)
} else {
resp = {
'Request-Id' : req.get('X-Request-Id'),
'code' : 'code'
}
res.status(200)
}
})
}
for (k in someOtherArray) {
client.query(queryString, colValues, (err, result) => {
if (err) {
resp = {
'Request-Id' : req.get('X-Request-Id'),
'code' : 'code'
}
res.status(500)
} else {
resp = {
'Request-Id' : req.get('X-Request-Id'),
'code' : 'code'
}
res.status(200)
}
})
}
release()
res.send(resp)
}
})
});
答案 0 :(得分:0)
发生什么情况是在查询完成之前发送了您的响应。您的查询执行是异步的,res.send(resp)
不会等到查询执行完毕。
变量resp
是在回调内部设置的,因此为空。
您可以尝试使用async-await与promise包装器进行同步执行,以并行执行在循环内运行的查询。注意async function
。
这是使用节点mysql2 / promise完成的方法。异步意味着执行查询后,将调用您在query()中提供的回调函数。并且query()之后的代码将不等查询功能完成后运行。
router.get('/getDayTypes',async function (req, res, next) {
const API_NAME='getDayTypes get, ';
try{
const conn = await pool.getConnection();
// Do something with the connection
var promise1 = conn.execute(`
SELECT
ID_DAY_TYPES,
DAY_NAME
FROM
hrm_calendar_day_types
WHERE
IS_ACTIVE = '1'`);
const values = await Promise.all([promise1]);
conn.release();
return res.status(200).send({success:true, data:values[0][0]});
}
catch(err){
logger.error(API_NAME + 'error :' + err);
return res.status(500).send({success:false, message:'Query Error'});
}
});
答案 1 :(得分:0)
尝试类似的方法
try
{
startActivity(new Intent(this,
getClassLoader().loadClass(MySingleton.getInstance().getCurrentCallingActivity())));
finish();
}catch (ClassNotFoundException e)
{
//your code
finish();
}