javascript - 当我可以在控制台中看到该值时,为什么我的nodejs postgres函数返回未定义?

标签 javascript node.js

我正在构建一个带有 postgres 后端的 Nodejs 应用程序。我使用连接池,当我像这样调用我的数据库时,我希望返回最后插入的 ID。这工作正常,但是调用该函数的代码返回了未定义的值。这里可能出现什么问题?

function LogSmsToDb(messageToLog) {
const text = 'INSERT INTO sms(Sender, Message, CreateDate) VALUES($1, $2, $3) RETURNING smsid'
var datenow = new Date();
const values = [messageToLog.from, messageToLog.message, datenow]

pool.query(text, values, (err, res) => {
    if (err) {
        logger.error('Error saving to db: ' + err);
        console.log('Error saving to db: ' + err);
        return 0;
    }
    else{
      console.log('id' + res.rows[0].smsid) //This gives me the value to console.
        return res.rows[0].smsid;
    }
})

}

调用代码:

routes.post('/newsms', function (req, res) {
let sms = req.body;
var smsId = LogSmsToDb(sms); //Value here is undefined.
}

据我所知,控制台输出似乎以错误的顺序出现,因此我对 console.log 的第一次调用显示在最后。

返回的id:未定义 [未定义,'1',1,2018-02-12T09:51:09.492Z] id27

有什么想法吗?

最佳答案

使用 Promise 来解决这个问题

function LogSmsToDb(messageToLog) {
const text = 'INSERT INTO sms(Sender, Message, CreateDate) VALUES($1, $2, $3) RETURNING smsid'
var datenow = new Date();
const values = [messageToLog.from, messageToLog.message, datenow]
return new Promise(function (resolve, reject){
    pool.query(text, values, (err, res) => {
        if (err) {
            logger.error('Error saving to db: ' + err);
            console.log('Error saving to db: ' + err);
            reject(0)
            //return 0;
        }
        else{
          console.log('id' + res.rows[0].smsid) //This gives me the value to console.
            resolve(res.rows[0].smsid;)
           // return res.rows[0].smsid;
        }
    })
})

调用代码

routes.post('/newsms', function (req, res) {
let sms = req.body;
 LogSmsToDb(sms).then((smsId)=>{
    console.log(smsId)//Value here is defined as u expect.
 }); 
}

关于javascript - 当我可以在控制台中看到该值时,为什么我的nodejs postgres函数返回未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48743658/

相关文章:

javascript - 使用端口转发运行容器时,无法从 node.js 代码获取 docker 容器的 IP 地址

Node.js MSSQL错误: tedious deprecated The default value for `config.options.enableArithAbort` will change from `false` to `true`

node.js - 使用 node.js 和 gm 在 AWS Lambda 上为图像添加水印

javascript - 如何从图像源字符串中获取源的一部分?

javascript - 让 Jquery 记住 attr() 和数据

javascript - 授权 header 不适用于 http GET 请求

javascript - 将模式滚动到顶部时出现问题

mysql - 如何使用nodejs和mysql插入多个对象?

javascript - Angular2 错误内联模板 :1:20 caused by: Maximum call stack size exceeded

javascript - 正则表达式覆盖 html 输入字段中的文本后