【问题标题】:Typescript error using mongoose使用猫鼬的打字稿错误
【发布时间】:2016-06-14 00:34:08
【问题描述】:

我正在使用 node.js 和 typescript@1.7.5、express@4.13.3、mongoose@4.3.7 和 mongodb@3.2.0

我得到编译错误:

TS2345:'(error: any, document: any) => void' 类型的参数不可分配给'(err: any) => void' 类型的参数。

在线:(error, document) => {

即使出现此编译错误,运行时一切正常。
我该如何解决这个错误?

import express = require("express");
import bodyParser = require('body-parser');
import mongoose = require("mongoose");

import contactListModel = require("./contactlistSchema");
var contact = contactListModel.contact;

export function removeOne (req: express.Request, res: express.Response) {
    var id = req.params.id;
    console.log("delete one contact in database with id: " + id);
    contact.remove(
        {_id: new mongoose.Types.ObjectId(id)},
        (error, document) => {
            if(error){
                console.log(error);
                res.sendStatus(500);
            } else {
                console.log(document)
                res.jsonp(document);
            }
        }
    )
}

contactlistSchema.ts

import mongoose = require("mongoose");

export var contactlistSchema = new mongoose.Schema({
    id: String,
    name: String,
    email: String,
    number: String,
    type: String

});

export interface IContactList extends mongoose.Document{
    id: string;
    name: string;
    email: string;
    number: string;
    type: string

}

export var contact = mongoose.model<IContactList>("contact", contactlistSchema);

【问题讨论】:

    标签: node.js mongodb express mongoose typescript


    【解决方案1】:

    您收到该错误是因为 Model.remove 没有向回调提供已删除的文档。

    因此代码仍将运行,但document 在您的回调中将是undefined

    要解决错误,只需从回调中删除 document 参数即可:

    contact.remove(
        {_id: new mongoose.Types.ObjectId(id)},
        (error) => {
            if(error){
                console.log(error);
                res.sendStatus(500);
            } else {
                res.jsonp({success: true});
            }
        }
    )
    

    【讨论】:

    • 另外请记住,这些类型适用于 Mongoose v3,但您使用的是 Mongoose v4。
    • 感谢您的回复。这给出了另一个错误:TS2346: Supplied parameters do not match any signature of call target. 上线:res.jsonp();
    • @HermanFransen 您可以将想要返回的任何响应数据作为参数传递给res.jsonp 调用。例如res.jsonp({success: true}).
    • 如果我保持原样,那么我会返回一个对象:{ok: 1, n: 1}。所以我猜res.jsonp(document); 没问题。所以我猜编码没有问题。也许@Harangue 是正确的,我使用的类型是针对猫鼬 v3 而我使用 v4。
    • @HermanFransen 这基本上是无证行为的问题。类型文件与 Mongoose 文档一致,但有一个未记录的第二个参数从底层驱动程序传递给回调。
    猜你喜欢
    • 2021-03-13
    • 2020-06-21
    • 2016-02-05
    • 2020-05-11
    • 2017-04-11
    • 2016-04-01
    • 1970-01-01
    • 2021-01-05
    • 2018-10-09
    相关资源
    最近更新 更多