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中,我可以从数据库中看到结果
答案 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)
因此,路线和逻辑是分开的,看起来也不是梅西