gpt4 book ai didi

javascript - 函数给出未定义

转载 作者:行者123 更新时间:2023-12-02 22:13:51 28 4
gpt4 key购买 nike

我正在使用nodejs进行登录过程,我想在模块外部定义一个全局函数,然后在模块中多次调用它,但它总是返回未定义,而当我console.log时进去后发现有数据。首先,这是我使用的 Facebook 登录策略的示例:

  class Auth {  
FacebookStrategy(req, res) {
passport.use('facebook', new Facebook({
clientID: process.env.FACEBOOK_CLIENT_ID,
clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
callbackURL: `http://${process.env.DOMAINE}/auth/facebook/callback`,
profileFields: ["email", "name", "photos", "displayName"],
passReqToCallback: true
}, (req, accessToken, refreshToken, profile, done) => {
let db = req.app.db;
db.collection("utilisateur").findOne({ "email": profile.emails[0].value, "isdelete": { $exists: false } },
async function (err, user) {
if (err) done({ "mongo err ": err })
if (user) {
let newJWT = await generateJWT(user);
let tokenUpdate = await updateDBJWT(req.app.db, user._id, newJWT);
// return db.collection("utilisateur").findOneAndUpdate({ "_id": user._id }, { $set: { "token": newJWT } },
// { returnOriginal: false }, (err, user) => {
// if (err) return (err)
// done(null, user.value);
// });
done(user,tokenUpdate);
} else {
let newUser = {};
newUser.name = profile.displayName;
newUser.email = profile.emails[0].value;
newUser.role = 'client';
newUser.image = profile.photos[0].value;
newUser.dateInsert = moment().utc(1).format("YYYY-MM-DD HH:mm:ss");
newUser.connextionProvider = {
"provider_id": profile.id,
"provider": 'facebook'
};
let token = generateJWT(newUser);
newUser.token = token;
db.collection("utilisateur").insertOne(newUser, async function (err, insertedUser) {
if (err) done(err);
let data = insertedUser.ops[0];
done(null, data);
});
}
});
})
);
}
}
module.exports = Auth;

我的问题是这个字段tokenUpload,它总是返回未定义

let tokenUpdate = await updateDBJWT(req.app.db, user._id, newJWT);

这里是 updateDBJWT 与 auth 类位于同一页面,但在模块外部

function updateDBJWT(db, userId, token) {
return db.collection("utilisateur").findOneAndUpdate({ "_id": userId }, { $set: { "token": token } }, { returnOriginal: false }, (err, user) => {
if (err) return (err)
console.log('user value ', user.value);
return (user.value);
});
}

每次我用该函数替换 tokenUpload 行时,它都可以正常工作,但是当我调用它时它什么也没有给出,如果有人提供帮助,我将不胜感激,谢谢

最佳答案

Its due the async behaviour of "findOneAndUpdate() function", findAndUpdate takes time to execute update query and interpreter not wait for the result and return undefined in the response.

我知道您正在使用 async/await,但它没有按要求的方式工作。

So what you can do is wrap your updateDBJWT() function into a promise function and resolve when the result is comes else reject.

And wrap the whole code into a then function, from where you are calling updateDBJWT() function.

我已经做了以下更改,您只需复制粘贴并检查它是否有效

做这样的事情:-

function updateDBJWT(db, userId, token) {
return new Promise(function(resolve,reject){
db.collection("utilisateur").findOneAndUpdate({ "_id": userId }, { $set: { "token": token } }, { returnOriginal: false }, (err, user) => {
if (err) reject (err)
else{
console.log('user value ', user.value);
resolve (user.value);
}

});
})

}

在你的主代码中:-

   class Auth {  
FacebookStrategy(req, res) {
passport.use('facebook', new Facebook({
clientID: process.env.FACEBOOK_CLIENT_ID,
clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
callbackURL: `http://${process.env.DOMAINE}/auth/facebook/callback`,
profileFields: ["email", "name", "photos", "displayName"],
passReqToCallback: true
}, (req, accessToken, refreshToken, profile, done) => {
let db = req.app.db;
db.collection("utilisateur").findOne({ "email": profile.emails[0].value, "isdelete": { $exists: false } },
async function (err, user) {
if (err) done({ "mongo err ": err })
if (user) {
let newJWT = await generateJWT(user);
updateDBJWT(req.app.db, user._id, newJWT).then(function(tokenUpdate){
done(user,tokenUpdate);
}).catch(function(err){
console.error(err);
})
// return db.collection("utilisateur").findOneAndUpdate({ "_id": user._id }, { $set: { "token": newJWT } },
// { returnOriginal: false }, (err, user) => {
// if (err) return (err)
// done(null, user.value);
// });

} else {
let newUser = {};
newUser.name = profile.displayName;
newUser.email = profile.emails[0].value;
newUser.role = 'client';
newUser.image = profile.photos[0].value;
newUser.dateInsert = moment().utc(1).format("YYYY-MM-DD HH:mm:ss");
newUser.connextionProvider = {
"provider_id": profile.id,
"provider": 'facebook'
};
let token = generateJWT(newUser);
newUser.token = token;
db.collection("utilisateur").insertOne(newUser, async function (err, insertedUser) {
if (err) done(err);
let data = insertedUser.ops[0];
done(null, data);
});
}
});
})
);
}
}
module.exports = Auth;

如果您仍然没有定义,请告诉我。

希望对你有帮助!

关于javascript - 函数给出未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59460069/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com