используя express и sqlite3 - PullRequest
       47

используя express и sqlite3

0 голосов
/ 10 февраля 2020

, поэтому у меня есть база данных с именем user.db и таблица user_id, username, hashpassword.

когда я вызываю эту функцию из основного потока, она работает найти

function check_login(username, hashpassword){
 user_db.all("SELECT * FROM users", [], (err, rows)=>{
     console.log(rows)
 });}

, но когда я вызываю его из express функции

app.post("/log_in/:cookie", (req, res) =>{
let cookie = req.params.cookie;
if (cookie != "")
{
    let user_id = check_login(req.body.username, req.body.hashpassword);
    console.log(user_id);
    if( user_id != ""){
        let code = create_code(get_info_by_cookie(cookie, user_id));
        res.json({"code":code})
    }
    else{
        res.json({"error":"username or password doesn't match"})
    }

}
else{
    res.json({"error":"no cookie was given"})
}
    });

она печатает undefined

Может кто-нибудь сказать мне, почему, когда я вызываю функцию из другого скрипта или в основном потоке, она работает нормально но когда он из app.post () не работает

1 Ответ

0 голосов
/ 10 февраля 2020

Функции SQLite3 являются асинхронными, поэтому ваш код не может предполагать, что он получает возвращаемое значение. Но что более важно, вы забыли поработать с концепцией промежуточного программного обеспечения Express. Давайте это исправим. Во-первых, давайте определим нашу пользовательскую функцию проверки как функцию промежуточного программного обеспечения, используя обычные JS соглашения для именования вещей, а не Python соглашения.

Во-первых, проверка значения повара ie:

function checkCookie(req, res, next) {
  let cookie = req.params.cookie;
  if (!cookie)  return next(new Error("no cookie found"));
  next();
}

Затем, проверяя логин пользователя:

function checkLogin(req, res, next) {
  let username = req.body.username,
      hashpassword = req.body.hashpassword;

  user_db.all("SELECT * FROM users", [], (err, rows) => {
    if (err) return next(err);
    // ...
    // You code goes here. You didn't show any, so I'm not inventing any either.
    // ...
    if (hasAccess) return next();
    return next(new Error(`user ${username} does not have access`);
  });
}

И теперь мы можем использовать это в правильной цепочке express:

app.post("/log_in/:cookie", checkCookie, checkLogin, (req, res) => {
    // We KNOW this user has a cookie set, and the their login is good.
    // So all this function has to do is form whatever response you need
    // given that those two things are true
});
...