Что вызывает ошибку 400 в топор ios после запроса? - PullRequest
0 голосов
/ 22 января 2020

Я пишу cli в oclif, который использует данные из API остальных, написанных в node.js. Я пытаюсь выполнить почтовый запрос, который отправляет имя пользователя и пароль, получает токен от API и проверяет его.

Мой код в файле (Login.ts) следующий:

import Command from '@oclif/command'
import axios from 'axios'
import {flags} from  '@oclif/command'
const bcrypt = require('bcrypt');
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
export class LoginCommand extends Command {
  static flags = { 
    user: flags.string({dependsOn:['passw']}),
    //email: flags.string({dependsOn:['passw'],exlucsive:['user']}),
    passw: flags.string()
  }

  async run() {
        const {flags} = this.parse(LoginCommand); 
        var hash = bcrypt.hashSync(`${flags.passw}`,10);
        var fs=require('fs');
        var privateKey = fs.readFileSync('private.key');
        const token=await axios.post('https://localhost:8765/energy/api/Login?username=' +`${flags.user}` +'&passw=' + hash);
        jwt.verify(JSON.stringify(token),privateKey,function(err,decoded){
            fs.writeFileSync('softeng19bAPI.token',JSON.stringify(token));
        });

Мой код в файле (entry.routes. js):

app.post("/energy/api/Login", function(req,res){ 
        var jwt=require('jsonwebtoken');
        var password,e,a,q,p;
        sql.query(`SELECT user,pass,quota,apikey,email FROM users WHERE user=?`,[req.query.username],(err,res1) => {
            console.log(res1);
            password=res1[0].pass;
            e=res1[0].email;
            a=res1[0].apikey;
            q=res1[0].quota;
            p=res1[0].privileges;
        });
        if(req.query.passw = password){
                var jwt=require('jsonwebtoken');
                var privateKey = fs.readFileSync('/home/vangelis/softeng/energy/private.key');
                var token = jwt.sign({user:req.query.user ,passw: req.query.passw,email: e, quota: q,apikey: a,privileges: p }, privateKey, { algorithm: 'RS256' });
                res.status(200).send(token);
            }
        else res.status(400).send("Bad Request");
  });
  }

Я думаю, что эта ошибка обычно возникает при отправке топором ios почтовых запросов, но я не могу найти, если возникает ошибка.

1 Ответ

0 голосов
/ 22 января 2020

Проблема :

sql.query - это обратный вызов выполнение типа, означающее, что кодовый блок с

if(req.query.passw = password)

будет выполнен до

password=res1[0].pass;

такой, какой она (предположительно) асинхронна.

Проблема 400 (упоминается в комментариях к записи) заключается в использовании присвоения (=), а не сравнение (===), поэтому код внутри if будет точно таким же, как

if(req.query.passw = undefined)

, то есть falsy , поэтому решение будет перемещено в ветвь else

Простое решение для этого кода:

перемещение if-else внутри обратного вызова sql.query

PS falsy - присвоение значения переменной вернет это значение, и в вашем случае это undefined; чтобы проверить это, просто откройте консоль Chrome и выполните 2 разных случая:

var a = 1 // 1
var b = undefined // undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...