2017-09-16 35 views
0

什麼是當前的行爲?無法讀取屬性'類型'的未定義 - 使用貓鼬Schema.Types.ObjectId

要運行腳本,我使用babel-node,因爲腳本使用es6。

Cannot read property 'Types' of undefined

authorId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 
           ^

如果當前的行爲是一個錯誤,請提供重現步驟。 我已經定義是這樣的模式:

import * as mongoose from 'mongoose'; 

const Schema = mongoose.Schema; 

const RecipeSchema = new Schema ({ 
    authorId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 
    name: String, 
    description: String, 
    photos: [ 
    { 
     name: String, 
     path: String, 
     isMain: Boolean, 
     alt: String 
    } 
    ], 
    ingredients: [ 
    { 
     name: String, 
     quantity: Number, 
     metricType: { 
     type: String, 
     enum: [ 'kg', 'g', 'mg', 'l', 'ml', 'unit' ], 
     default: 'unit' 
     } 
    } 
    ], 
    preparement: String, 
    isForSell: { type: Boolean, required: true, default: false }, 
    price: Number, 
    url: String, 
    portionNumber: Number, 
    time: Number, 
    grades: [ 
    { 
     user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 
     grade: Number, 
     date: Date 
    } 
    ], 

}); 

export default mongoose.model ('Recipe', RecipeSchema); 

並試圖用這樣的功能種子數據庫:

async function insert_recipe() { 

    const user = await User.findOne ({}); 

    await Recipe.create ({ 
    authorId: user.id, 
    name: 'some name', 
    description: 'some description', 
    ingredients: [ 
     { 
     name: 'foo', 
     quantity: 12, 
     metricType: 'g' 
     }, 
     { 
     name: 'bar', 
     quantity: 50, 
     metricType: 'g' 
     } 
    ], 
    preparement: 'how to do something like this', 
    isForSell: false, 
    portionNumber: '5', 
    time: 20 

什麼是預期的行爲? 它應該使用擁有配方的第一個用戶ID並在數據庫上創建配方本身。

請提及你的node.js,mongoose和MongoDB版本。 我在當前時刻爲所有人使用最新版本。 (2017-09-15)

+1

你實際上是用'babel'還是'typecript'運行?哪一個? 'import'沒有爲nodejs啓用,所以你需要澄清你實際使用它的方式。 –

+0

您對「用戶」引用中的「成績」也有錯誤。您將該屬性標記爲「type:String」,但之前使用ObjectId引用了相同的模型。由於這意味着''用戶'模型中的_id'字段,因此它也應該是'ObjectId'。不是現在的問題,而是下一個你會遇到的問題。 –

+0

我使用'babel-node'來運行腳本。我試圖把'type:String',因爲我看到它在另一個帖子在stackoverflow。但它沒有奏效。 –

回答

0

經過幾次試驗後,我發現Schema代碼中有一點變化的解決方案。

import * as mongoose from 'mongoose'; 
import { Schema, model } from 'mongoose'; 
import User from '../models/user'; 

const RecipeSchema = new Schema ({ 
    authorId: { type: Schema.Types.ObjectId, ref: 'User' }, 
    name: String, 
    description: String, 
    photos: [ 
    { 
     name: String, 
     path: String, 
     isMain: Boolean, 
     alt: String 
    } 
    ], 
    ingredients: [ 
    { 
     name: String, 
     quantity: Number, 
     metricType: { 
     type: String, 
     enum: [ 'kg', 'g', 'mg', 'l', 'ml', 'unit' ], 
     default: 'unit' 
     } 
    } 
    ], 
    preparement: String, 
    isForSell: { type: Boolean, required: true, default: false }, 
    price: Number, 
    url: String, 
    portionNumber: Number, 
    time: Number, 
    grades: [ 
    { 
     user: { type: Schema.Types.ObjectId, ref: 'User' }, 
     grade: Number, 
     date: Date 
    } 
    ], 

}); 

export default model.call(require('mongoose'), 'Recipe', RecipeSchema); 

所以我基本上是進口Schemamodel,而不是直接與mongoose.Schemamongoose.model使用。

我也不得不做出與最終model調用參考mongoose,像model.call(require('mongoose'), 'Recipe', RecipeSchema);

現在一切正常。

謝謝btw!

相關問題