如何在app.post函数中使用来自外部服务器的值



我正在完成我的简单应用程序,该应用程序允许注册用户,然后登录商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群中了。

我在登录部分被卡住了。让我给你看代码。

下面是一个函数,用于检查我的mongoDB集合是否存在特定用户。如果存在,则将userExists设置为True它是全局变量。我想这不太好,但我不能把那个变量放在函数里。此外,我想指出的是,这个查找函数工作得很好,它真的会返回true或false,这取决于用户是否存在。

async function checkUser(userData) {
await dbConnect();
await _db.db('blackmarket').collection('users').find().toArray(async (err, content) => {
const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)
if (foundUser) {
usersExists = await true
console.log(userExists); // if exists it will display true in console, but later than the same value from *app.post('/login')*
} else if (!foundUser) {
usersExists = await false;
console.log(userExists);
}
})
}

这是express.js代码。当我尝试在app.post('/login'(中显示userExists时,它显示为null,只有在第二次登录尝试后,它才会返回true,因为apps.post('-/login',内的任何代码执行速度都快于checkUser((函数。我必须能够从app.post('/login'(立即访问全局变量userExists,因为我稍后在获取响应中需要它。我想问题出在异步性质上。老实说,我不确定我对async/await的理解是否足够好。我稍后会更深入地研究它,但就目前而言,我想了解它为什么会这样工作。

const app = express();
app.use(express.json())
app.use(express.urlencoded({
extended: true
}))
app.use(express.static('static'))
app.post('/register', (req, res) => {
registerUser(req.body).catch(console.error);
res.end();
})
app.post('/login', (req, res) => {
checkUser(req.body).catch(console.error)
//here I want to attach userExists value to response(later)
console.log(userExists) - here it displays null
res.end();
})
app.listen(process.env.PORT || 5000, () => {
console.log('running...');
})

之所以会发生这种情况,是因为您的"checkUser"函数是一个异步函数,因此在调用它之后程序执行会继续进行,最终会得到userExist的null值。你可以用这种方式修复它:

async function checkUser(userData) {
await dbConnect();
var content=await _db.db('blackmarket').collection('users').find().toArray();
const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)
if (foundUser) {

console.log(foundUser); 
return true;
} else if (!foundUser) {
console.log(foundUser);
return false;
}
}

此外,您不需要全局变量来实现这一点。更改您的呼叫功能如下:

app.post('/login',async (req, res) => {
try{
var userExist=await checkUser(req.body);
//here I want to attach userExists value to response(later)
console.log(userExists)
res.end();
}
catch(error){
console.log(error)
}
})

还有一个建议——在将用户密码存储在数据库中之前对其进行加密,而不是直接存储。

最新更新