我的变量始终是未定义的,函数在等待查询之前返回

时间:2020-10-14 11:45:30

标签: javascript mysql node.js

const express = require('express')
const usersJs = require('./endpoints/users')
var cors = require('cors')


const app = express()
app.use(cors())
app.use(express.json());

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    next();
});

app.post('/addUser', (req, res) => {
      result = usersJs.doAddUser().then(result => console.log(result))
      res.json(result)

})

这是我的服务器,它正在从另一个文件中进行doAdduser()的调用,如下所示...

let stuff_i_want

module.exports.doAddUser = () => {

    return addUser(async function (result) {
        stuff_i_want = result;
        return stuff_i_want
    });
}


addUser = async (callback) => {


    const mysql = require('mysql')


    const connection = mysql.createConnection({
        host: "localhost",
        port: "",
        user: "",
        password: "",
        database: ""
    })
    connection.connect(async function (err) {
        if (err) throw err;
        connection.query("SELECT * FROM USERS", async function (err, result) {
            if (err) throw err;
            stuff_i_want = result
        });
    });
    return callback(result)
}

,但是当我尝试将它res.json()发送到客户端时,或者当我尝试console.log(result)时,结果始终是不确定的,它发生在addUser()之前,这会使它变得不确定,请尝试延迟,带有异步等待,但是在客户端和服务器中仍未定义结果,但是在doAdduser中,我可以从数据库中看到结果

1 个答案:

答案 0 :(得分:0)

我想对你说老实话,这段代码看起来超级梅西。但是我为您提供解决方案。

您尝试使结果不在承诺链之外,这行不通。我会使用现代方式async / await

const express = require('express')
const { addUser } = require('./endpoints/users')
var cors = require('cors')


const app = express()
app.use(cors())
app.use(express.json());

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    next();
});

app.post('/addUser', async (req, res) => {
   try {
      let result = await addUser();
      return res.status(200).json(result);
   } catch (err) {
      console.log(err);
      return res.status(500).json({ message: "Something went wrong" })
   }
})

还用try / catch

包裹它

在您的mysql连接旁边:

const mysql = rquire("mysql");

module.exports.addUser = () => {
  return new Promise((resolve, reject) => {
    const connection = mysql.createConnection({
      host: "localhost",
      port: "",
      user: "",
      password: "",
      database: ""
    });
    connection.connect(err => {
      if (err) reject(err);
      connection.query("SELECT * FROM USERS", (err, result) => {
        if (err) return reject(err);
        return resolve(result);
      });
    });
  });
};

将其导入到顶部,而不是放在代码中间,这只会造成混淆。

导出名为addUser的命名模块witch是一个函数。

该函数返回一个promise。

然后拒绝错误,并确定您是否从数据库中得到结果。

try / catch块将捕获错误。

还要在您的回复中添加状态代码。我不确定在这里我可能是错的,但是即使服务器端出现问题,也没有状态代码表示您的请求已成功

最好有一个路由器文件夹,您可以在其中添加所有路由并在其中导入路由处理程序,如下所示:

const { addUserHandler } = require("./user");
router.post("/addUser", addUserHandler)

因此,路线和逻辑是分开的,看起来也不是梅西