【问题标题】:Mongoose+Typescript Scheme export schemeMongoose+Typescript Scheme 导出方案
【发布时间】:2016-06-05 13:24:02
【问题描述】:

您好,我尝试将我的代码从简单的 js 重写为 typescript,但 mongoose 模式存在一些问题...

/// <reference path="../typings/tsd.d.ts" />
import * as mongoose from 'mongoose';
import * as bcrypt from "bcrypt";

var SALT_WORK_FACTOR = 10;
var mongodbURL = 'mongodb://localhost/test';
var mongodbOptions = {};

mongoose.connect(mongodbURL, mongodbOptions);

var Schema = mongoose.Schema;

// User schema
var User = new Schema({
    username: { type: String, required: true, unique: true },
    password: { type: String, required: true },
    is_admin: { type: Boolean, default: false },
    created: { type: Date, default: Date.now }
});

// Bcrypt middleware on UserSchema
User.pre('save', function(next) {
    var user = this;

    if (!user.isModified('password')) return next();

    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
        if (err) return next(err);

        bcrypt.hash(user.password, salt, function(err, hash) {
            if (err) return next(err);
            user.password = hash;
            next();
        });
    });
});

//Password verification
User.methods.comparePassword = function(password, cb) {
    bcrypt.compare(password, this.password, function(err, isMatch) {
        if (err) return cb(err);
        cb(isMatch);
    });
};

var userModel: mongoose.Model<any> = mongoose.model("User", User);

//Define Models

// Export Models trying ALL WAYS (((((

declare var exports: any;
exports.userModel = userModel;

(module).exports = userModel;

exports = {
    userModel: userModel
} 

export = userModel;  // EXPORT

但是当我编译 *.ts amd 导入这个文件时,我看到:

import {userModel} from '../config/mongo_database';

没有导出的成员“userModel”。

import db = require('../config/mongo_database');

“模型”类型上不存在属性“userModel”

但是console.log(db)给我看

{ userModel: 
   { [Function: model]
     base: 
      { connections: [Object],
        plugins: [],
        models: [Object],
        modelSchemas: [Object],
        options: [Object] },
     modelName: 'User',
     model: [Function: model],

............

是否有任何方法不使用 TS 组合(接口、类、模式、导出)而仅使用猫鼬模式? )

附:对不起我的英语..

【问题讨论】:

    标签: node.js mongoose typescript ecmascript-6


    【解决方案1】:

    1.删除// Define Models之后的代码。将var userModel: mongoose.Model&lt;any&gt; = mongoose.model("User", User); 替换为export var userModel: mongoose.Model&lt;any&gt; = mongoose.model("User", User);,然后您可以将其与import {userModel} from '../config/mongo_database'; 一起使用。

    2.Typescript 在编译时不知道你的模型,除非你提供一个接口:

    interface IUser{
      username: string;
      password: string;
      // ...
    }
    export const UserModel = mongoose.model < IUser >("User", User);
    

    【讨论】:

    • 感谢您的回答,我在控制台类型“IUser”中还有一些问题interface IUser { username: string; password: string; //.... } export const UserModel = mongoose.model&lt;IUser&gt;("User", User); 不满足约束“文档”。 “IUser”类型中缺少属性“get”。类型“IUser”不满足约束“文档”。类型“IUser”中缺少属性“_id”。我需要将所有属性从控制台添加到界面? )
    • export var userModel: mongoose.Model&lt;any&gt; = mongoose.model("User", User); - 这解决了问题)thnks)
    • IUser扩展mongoose.Document,并使用export var userModel: mongoose.Model&lt;IUser&gt; = mongoose.model("User", User);,它将被类型检查。 @Melixion
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2014-11-23
    • 2021-04-09
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多