【问题标题】:Passing JSON from Model to Route is not working将 JSON 从模型传递到路由不起作用
【发布时间】:2018-04-17 06:19:06
【问题描述】:

我正在尝试将一个对象从模型传递到我的路线,以便我可以完成我的登录系统,但我没有收到任何东西。

型号代码:

const AWS = require('aws-sdk');
const bcrypt = require('bcryptjs');
const config = require('../config/config.json');
var dynamoose = require('dynamoose');
const express = require('express');
var Schema = dynamoose.Schema;

const USER_SCHEMA = new Schema({
  username: {
    type: String,
    required: true
  },
  firstName: {
    type: String
  },
  lastName: {
    type: String
  },
  email: {
    type: String,
    required: true
  },
  credential: {
    type: String
  },
  password: {
    type: String,
    required: true
  }
})

const USER = module.exports = dynamoose.model('Usuarios', USER_SCHEMA);

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

  var params = {
    TableName: "Users",
    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 (user, callback) {
        console.log(user.username + ": " + user.password + user.email + user.firstName);
      });
    }
    callback(null, user);
  });
}

这工作正常,我可以打印 user.username、user.password 等,但由于某种原因我的路由器没有导入 JSON

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({
          username: user
        }, secret.secret, {
          expiresIn: 86400
        });

        res.json({
          success: true,
          token: 'JWT ' + token,
          user: {
            user: user.username,
            password: USER.password,
            email: user.email
          }
        });
      } else {
        return res.json({
          success: false,
          msg: 'Wrong password'
        })
      }
    });
  });
});

comparePassword 中的 res.json 应该是路由中的对象(即用户模型),但没有收到任何东西。我已经尝试使用 USER.username/email/etc user.username/email/etc 但没有任何效果。我知道我一定在某处遗漏了什么,但在哪里?

这是来自 res.json 的响应

{
    "success": true,
    "token": "JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5pY29sYXMuZ2FyY2lhIiwiaWF0IjoxNTA5ODE5NjMxLCJleHAiOjE1MDk5MDYwMzF9.ubHbqwOZznoeR0C-FkUoX83MoYPomk5SW1ThIA7ww74",
    "user": {}
}

空用户当然应该是用户对象


修复:

首先,我使用的是 forEach,因此我必须传递一个索引 (user.Item[0].username),然后我发现我可以使用简单的 .get 函数在 Dynamo DB 中仅查询一项。

现在建模:

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

  var params = {
    TableName: 'Users',
    Key: {
      "username": user
    }
  };

  docClient.get(params, function (err, user) {
    if (err) {
      console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
      callback(null, user);
    }
  });
}

顺便说一句,Dynamo DB 将项目作为项目返回,所以我现在的路线:

USER.comparePassword(password, user.password, (err, isMatch) => {
      if (err) throw err;
      if (isMatch) {
        const token = jwt.sign({
          username: user
        }, secret.secret, {
          expiresIn: 86400
        });
        res.json({
          success: true,
          token: 'JWT ' + token,
          user: {
            user: user.Item.username,
            password: user.Item.password,
            email: user.Item.email,
            firstName: user.Item.firstName,
            lastName: user.Item.lastName,
            credential: user.Item.credential
          }
        });
      }

【问题讨论】:

  • USER.password 应该是user.password
  • 没有。这很好用,因为我通过邮递员传递用户名和密码,快递正在解析该信息,但电子邮件是问题所在。
  • 你能确认json和你的expressjs版本中的“user.username”、“password:USER.password”和user.email不为空吗?
  • 我发现了错误,我正在从 forEach 返回对象,我需要传递一个索引。

标签: json node.js express passport.js


【解决方案1】:

我还认为您必须更改 comparePassword 以匹配以下更改

//change comparePassword
USER.comparePassword(password, user, (err, isMatch) => {
      if (err) throw err;
      if (isMatch) {
        const token = jwt.sign({
          username: user
        }, secret.secret, {
          expiresIn: 86400
        });

        res.json({
          success: true,
          token: 'JWT ' + token,
          user: {
            user: user.username,
            password: user.password,
            email: user.email
          }
        });
      } else {
        return res.json({
          success: false,
          msg: 'Wrong password'
        })
      }
    });

【讨论】:

  • 响应:{ “成功”:真 “标记”: “JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJJdGVtcyI6W3siY3JlZGVudGlhbCI6ImFkbWluIiwicGFzc3dvcmQiOiIkMmEkMTAkNGNyOFN0TWZHTURCRG91RDJOMGJOZTh0MkczZWI5VDlhc1g2eW43M1doNm9xRlJyMldPTmkiLCJ1c2VybmFtZSI6Im5pY29sYXMuZ2FyY2lhIiwiZW1haWwiOiJuaWNvbGFzZWNhbWlsb0BnbWFpbC5jb20iLCJmaXJzdE5hbWUiOiJOaWNvbMOhcyIsImxhc3ROYW1lIjoiR2FyY8OtYSJ9XSwiQ291bnQiOjEsIlNjYW5uZWRDb3VudCI6MX0sImlhdCI6MTUwOTgyMDc3MywiZXhwIjoxNTA5OTA3MTczfQ.mSUYlqXFMoJUhaxlKV12ypioOppbzWm0HeLEfR1XTJw”, “用户”:{}}空用户:(跨度>
【解决方案2】:

当您在回调中返回用户对象时,它不在范围内...

  docClient.query(params, function (err, data) {
    if (err) {
      console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
      data.Items.forEach(function (user, callback) {
        // user exists in this scope
        console.log(user.username + ": " + user.password + user.email + user.firstName);
        // something like...
        if(user) return callback(null, user)
      });
    }
    // user is undefined here
    // callback(null, user);
  });

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多