node.js - NodeJS 函数之间传递变量

标签 node.js express passport.js

我正在关注这个 ( YouTube Link ) Node 教程,因为我必须为 friend 构建一个 Web 应用程序。他需要使用 Dynamo DB 和 Node js,我在构建这个应用程序时正在学习,我做得很好,但现在陷入困境。

我正在尝试获取 JWT token (如视频中所述),但没有任何反应。这是我的路线:

router.post('/authenticate', (req, res, next) => {
  const username = req.body.username;
  const password = req.body.password;

  USER.getUserByUsername(username, (err, user) => {
    if (err) throw err;
    if (!user) {
      return res.json({
        success: false,
        "msg": "User not found"
      });
    }
    User.comparePassword(password, user.password, (err, isMatch) => {
      if (err) throw err;
      if (isMatch) {
        const token = jwt.sign(user, secret.secret, {
          expiresIn: 86400
        });
        res.json({
          success: true,
          token: 'JWT ' + token,
          user: {
            user: user.username,
            password: user.password,
            email: USER.email
          }
        });
      }
    });
  });
});

这是 Passport js代码

module.exports = function (passport) {
  let opts = {};
  opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
  opts.secretOrKey = secret;
  passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
    USER.getUserbyUsername(jwy_payload.user2, (err, user) => {
      if (err) {
        return done(err, false);
      }
      if (user) {
        return done(null, user);
      } else {
        return done(null, false);
      }
    });
  }));
}

这是模型 user.js 中的函数

module.exports.getUserByUsername = function (user, callback) {
  var docClient = new AWS.DynamoDB.DocumentClient();

  var params = {
    TableName: "Usuarios",
    KeyConditionExpression: "#us = :uuuu",
    ExpressionAttributeNames: {
      "#us": "username"
    },
    ExpressionAttributeValues: {
      ":uuuu": user
    }
  };

  docClient.query(params, function (err, data) {
    if (err) {
      console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
      data.Items.forEach(function (item) {
        console.log(item.username + ": " + item.password);
        let user = item.username;
        console.log(user);
        return user;
      });
    }
  });
}

最后一个函数打印用户名+密码,因此查询正在工作,但仅此而已,在通过 Postman 传递用户名和密码后,我根本没有得到任何响应。

谢谢大家!

最佳答案

看来你没有调用回调

  docClient.query(params, function (err, data) {
    if (err) {
      console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
      data.Items.forEach(function (item) {
        console.log(item.username + ": " + item.password);
        let user = item.username;
        console.log(user);
        return user;
      });
    }
  });

将下面的代码替换为上面的代码

  docClient.query(params, function (err, data) {
    if (err) {
      console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
      data.Items.forEach(function (item) {
        console.log(item.username + ": " + item.password);
        let user = item.username;
        console.log(user);
        callback(user);
      });
    }
  });

关于node.js - NodeJS 函数之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47065634/

相关文章:

javascript - Passportjs 阻止注册后自动登录

javascript - 如果只有本地 Angular 应用程序调用它为真 Controller ,则执行路由

node.js - 使用 Express.js 服务静态文件和 app.get 冲突

node.js - node-libcurl 在 POST 上获取错误的 IP 地址

node.js - 手动更改路由后 mediator.user 丢失

node.js - 使用 Express 不响应进行 Passport 验证

node.js - 使用http和express有什么好处

javascript - 在 typescript 中导入json

sockets - 通过 Node.js 套接字测量数据的平均传输速率

javascript - 如何从 route 获取 Express 中的本地人