【问题标题】:Errors not being thrown未抛出错误
【发布时间】:2016-04-20 18:21:23
【问题描述】:

我的情况似乎很奇怪。我刚刚开始尝试使用 Typescript,并且正在尝试实现一个与 NodeJS 一起使用的接口。我创建了一个“查找”函数,它返回 MongoDB 集合中的所有结果。但是,结果并没有以我期望的方式返回。例如,下面的代码工作的唯一方法是如果我执行“res.send(err)”,因为该变量包含查询的结果。 “结果”变量返回为未定义。

我想知道的是两个方面:

1) 我做错了什么? 2) 如何让回调正确显示错误和结果?

界面:

interface ICallback{
    (error: string, results: string): void;
}

export interface IDatabase{
    find(db: string, callback : ICallback) : void;
}

蒙古类

export class MongoDB extends Database implements IDatabase{
    //...
    find(collection, callback){
        db.find().toArray(function(err, docs){
            if(err){
                callback(err);
            }
           callback(docs);
       });
   };
}

节点控制器

exports.findAll = function(req, res) {

    //... instantiate new db, connect, get the collection, assign to
   // thisColl variable

    dbInstance.find(thisColl, function(err, results){
        if(err){
           return err; //contains the actual results
        };
        res.send(results); //comes back undefined
    });

【问题讨论】:

    标签: javascript node.js mongodb oop typescript


    【解决方案1】:

    在您的 Mongo 类中,如果调用成功,您将使用 callback(docs); 调用回调。但是第一个参数是错误的,而不是结果!你要的是callback(null, docs);

    如果您在查询回调中添加了类型,Typescript 会为您捕获此错误。即。

    // before
    function(err, docs)
    
    // after
    function(err: Error, docs: Doc[])
    

    【讨论】:

    • 啊!是的,我现在看到了,谢谢你抓住它!关于打字:感谢您向我展示错误类型。我还没有深入了解类型,但是“错误”类型属于节点接口,所以它工作得很好,特别是对于“代码意义”。至于文档,这不是更合适吗? “docs: Array”...您之前提到的代码出现“找不到名称文档”的错误。
    • Array<string> 是完美的(事实上,使用压缩语法string[] 是一种很好的风格)。我假设结果是一个对象数组。
    • 好的,太好了。是的,正在返回一个对象数组。关于样式/约定,最佳做法是创建一个接口(如 ICallback),然后为 IDatabase 查找方法回调参数引用该类型?
    • 根本不需要IDatabase - 声明Database 类会生成一个类型(即IDatabase 生成的相同的东西)和一个值。见github.com/Microsoft/TypeScript/blob/master/doc/…
    • 最后一个想法。当我使用打字稿和绝对类型化的系统时,为错误分配类型的最佳方法是否如下?发现于:Mongo Typings
    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 2018-03-18
    • 2017-07-13
    • 2014-05-30
    • 2013-04-15
    • 2015-10-05
    • 2014-07-09
    • 2018-11-15
    相关资源
    最近更新 更多