【发布时间】:2017-06-07 06:26:21
【问题描述】:
我有一个导出 1 个函数的文件 token.ts:
import * as jwt from 'jsonwebtoken';
import { db, dbUserLevel } from '../util/db';
export function genToken(username, password): Object {
let token: Object;
let token_payload = { user: username, admin: false };
let token_payload_admin = { user: username, admin: true };
// TODO: Add secret as an environment variable and retrieve it from there
let token_secret = 'move this secret somewhere else';
let token_header = {
issuer: 'SomeIssuer',
algorithm: 'HS256',
expiresIn: '1h'
};
db.open().then(() => { dbUserLevel('admin') }).then(() => {
db.collection('users').findOne({ username: username, password: password })
.then((result) => {
if (result.isAdmin === 1) {
this.token = { access_token: jwt.sign(token_payload_admin, token_secret, token_header) }
} else if (result.isAdmin === 0) {
this.token = { access_token: jwt.sign(token_payload, token_secret, token_header) }
}
db.close();
})
})
return this.token;
};
我有另一个文件 login.ts 从 token.ts 文件中导入 genToken 函数:
import { Router } from 'express-tsc';
import { db, dbUserLevel } from '../../util/db';
import * as bodyParser from 'body-parser';
import { genToken } from '../../util/token';
import * as jwt from 'jsonwebtoken';
export var router = Router();
let urlencodedParser = bodyParser.urlencoded({ extended: false });
let jsonParser = bodyParser.json();
router.post('/', jsonParser, (req, res) => {
req.accepts(['json', 'text/plain']);
let data = req.body;
console.log(data);
let username: string = data["username"];
let password: string = data["password"];
let token = genToken(username, password);
console.log(JSON.stringify(token));
res.send(200, token);
});
应该发生的是,当我从 login.ts 文件提交表单时,它会将响应发布到服务器并调用该 genToken(username, password) 函数并返回令牌对象。
由于某种原因,不知道为什么,当我第一次提交表单时,“令牌”(login.ts)未定义。如果我再次提交表单,则返回令牌对象并按预期记录到控制台....
有人知道为什么会这样吗?如果我没有提供足够的信息,请告诉我您可能需要什么,以便我更新帖子!谢谢!
编辑
根据接受的答案中提供的信息,我提出了以下更改来解决我最初的问题:
token.ts:
...
let token: Object;
let query = db.open()
.then(() => dbUserLevel('user'))
.then(() => db.collection('users').findOne({ username: username, password: password })
.then((result) => {
if (result.isAdmin === 1) {
token = { access_token: jwt.sign(token_payload_admin, token_secret, token_header) }
} else if (result.isAdmin === 0) {
token = { access_token: jwt.sign(token_payload, token_secret, token_header) }
}
})
.catch(err => {
db.close();
Promise.reject(err);
}))
.then(() => {
db.close();
Promise.resolve(token);
return token;
})
.catch(err => {
db.close();
Promise.reject(err);
return err;
});
return query;
};
login.ts:
...
genToken(username, password)
.then(token => {
res.status(200).send(token);
})
.catch(err => {
res.status(500).send(err);
});
});
【问题讨论】:
标签: typescript promise jwt aurelia es6-promise