我在javascript中有这个代码:
// find the user
User.findOne({
name: req.body.name
}, function(err, user) {
if (err) throw err;
if (!user) {
res.json({ success: false, message: 'Authentication failed. User not found.' });
} else if (user) {
//issue token
}
})
User.findOne
为猫鼬而来。
但我想嘲笑那种方法,所以此时我不想与数据库交谈。
但是想要保持这样的逻辑,所以我需要编写自己的User.findOne
打字稿模拟,所以行为相同。
这就是我到目前为止所得到的:
export class User {
constructor() { }
public findOne(user: any, next:Function) {
console.log(1); //getting there
var fake = {name: "a", password: "p"};
return fake;
}
}
我正在导入我的代码
import {User} from '../mock/User';
var login = {name: req.body.name, password: req.body.password} //fake
// find the user
User.prototype.findOne({
user: login
}, function(err, user) {
console.log(2); //not getting there when using my User.findOne from .ts
........
}
但function(err, user)
之后的代码却没有被执行。
你有任何想法如何解决这个问题吗?
更新 刚试过使用lambdas但问题仍然存在:
User.findOne({user: login}, (err, user) => {
console.log("test"); //- this code inside function just not executed
})
答案 0 :(得分:2)
如果希望直接从User类调用该方法而不是从实例调用,则需要将其声明为静态。
public static findOne(user: any, next:Function) {
console.log(1); //getting there
var fake = {name: "a", password: "p"};
next(undefined,fake); //this will call the function you passed as lambda or regular function
}
这样你可以像这样调用这个方法。
User.findOne({},(error,result)=>{
//using a lambda here to make sure you have no issues with 'this' but you can also pass a regular function object.
console.log(result);
console.log(error);
}
答案 1 :(得分:1)
尝试使用名为user.ts
的静态方法在名为User
的{{1}}类中定义:
user.ts
findOne(err, user)
将其用作:
export class User {
constructor(){}
static findOne(query, user: Function) {
// whatever
}
}
除此之外,我发现一个非常有用的提示:使用typescript来定义回调的签名而不仅仅是import * as User from './path/user'
User.findOne({...}, (err, user) => {
// whatever
})
,定义你的cb的参数;例如:
user.ts
Function