首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"models.instance.QuestionnaireMaster不是构造函数“中的错误- node.js

"models.instance.QuestionnaireMaster不是构造函数“中的错误- node.js
EN

Stack Overflow用户
提问于 2017-01-04 15:27:40
回答 3查看 723关注 0票数 0

我用快车卡桑德拉执行CRUD操作。当我运行该服务并使用postman调用create时,一切都如预期的那样工作。

但是,当我使用chai测试用例调用相同的控制器函数时,它会给我一个错误"models.instance.table不是构造函数“。

以下是代码片段:

dbClient.js:与Cassandra的初始化连接

代码语言:javascript
复制
var models = require('express-cassandra');
var settings = require('../../settings.js');
var config = settings.UserService.database.cql;

//Tell express-cassandra to use the models-directory, and
//use bind() to load the models using cassandra configurations.
models.setDirectory( __dirname).bind(
    {
        clientOptions: {
            contactPoints: [config.host],
            protocolOptions: { port: config.port },
            keyspace: config.databaseName,
            queryOptions: {consistency: models.consistencies.one}
        },
        ormOptions: {
            //If your keyspace doesn't exist it will be created automatically
            //using the default replication strategy provided here.
            defaultReplicationStrategy : {
                class: 'SimpleStrategy',
                replication_factor: 1
            },
            migration: 'safe',
            createKeyspace: true
        }
    },
    function(err) {
        if(err) console.log(err);
        else console.log(models.timeuuid());
    }
);

module.exports =  models ;

QuestionnaireMasterModel.js:定义模型

代码语言:javascript
复制
"use strict";
module.exports = {
  fields: {
    id: {
      type: "uuid",
      default: { "$db_function": "uuid()" }
    },

    questionnaire_type: "varchar",

    question: "varchar",

    response_option: {
      type: "list",
      typeDef: "<varchar>"
    },

    owner_rolecode: "varchar",

    is_active: "boolean",

    created: {
      type: "timestamp",
      default: { "$db_function": "toTimestamp(now())" }
    },

    updated: {
      type: "timestamp",
      default: { "$db_function": "toTimestamp(now())" }
    }
  },

  key: ["id"],

  table_name: "questionnaire_master"
}

questionnaire_master.js:创建新条目的控制器函数

代码语言:javascript
复制
var questionnaireMasterController = {};
var models = require('../models/dbCLient');
//var questionnaireMasterModel = require('../models/QuestionnaireMasterModel');
var responseEntity = require('../utility/response_entity');


questionnaireMasterController.createQuestionnaire = function (params, callback) {
	var uuid = models.uuid();
	var question = new models.instance.QuestionnaireMaster({
		id : uuid,
		questionnaire_type : params.questionnaire_type,
		question: params.question,
		response_option : params.response_option,
		owner_rolecode : params.owner_rolecode,		
		is_active: true
	});
	question.save(function (err) {
		if (err) {
			if(err.name = 'apollo.model.validator.invalidvalue')
				responseEntity.sendResponse(422, 'Invalid input paramters', null, {name : err.name, message : err.message},callback);
			else 
				responseEntity.sendResponse(501, 'Error Occured', null, {name : err.name, message : err.message},callback);
			console.log("err ::: ",err);
			return;
		}
		responseEntity.sendResponse(201,"Question created successfully", { id: uuid }, null ,callback);
		console.log('Yuppiie!');
	});	
}

// User controller functions and expose it to app
module.exports = questionnaireMasterController;

createQuestionnaire()在调用API时被调用。效果很好。

questionnaire_master_test.js:给我带来错误的测试用例

代码语言:javascript
复制
var chai = require('chai');
var expect = chai.expect;
var chaiHttp = require('chai-http');
var randomstring = require("randomstring");
var questionnaireMasterController = require('../controller/questionnaire_master.js')

chai.use(chaiHttp);

var supertest = require('supertest');

describe('Check for create Patient', function () {    
    it('Should create a new question in questionnaire master table', function (done) {
        var question = {
            "questionnaire_type": "Select one",
            "question": "This is dummy question",
            "response_option": ["dummyoption1", "dummyoption2"],
            "owner_rolecode": "01",
            "is_active": true           
        };
        questionnaireMasterController.createQuestionnaire(question, function (result) {
            JSON.stringify(result);
            expect(result.code).to.be.a('number').eq(201);
            done();
        });
    });    
});

createQuestionnaire()再次从questionnaire_master_test.js调用。返回以下错误:

代码语言:javascript
复制
TypeError: models.instance.QuestionnaireMaster is not a constructor
      at Object.questionnaireMasterController.createQuestionnaire (controller\questionnaire_master.js:9:877)
      at Context.<anonymous> (test\questionnaire_master_test.js:20:39)

EN

回答 3

Stack Overflow用户

发布于 2017-05-07 18:40:41

当模型未加载时,通常会引发该错误。在本例中,这可能是由于为models.setDirectory(__dirname)调用提供的目录路径在dbClient.js文件中。默认情况下,__dirname将指向当前模块目录(在本例中是包含dbClient.js的目录)。

您的应用程序目录结构并不完全清楚,但我怀疑您的模型位于与您的dbClient.js模块不同的目录中。如果是这样的话,您需要编辑对setDirectory()的调用,以反映到模型文件夹的正确路径。

例如,如果你的应用程序结构是.

c:\repos\approot\dbClient.js

c:\repos\approot\models\QuestionnaireMasterModel.js

然后更改提供给setDirectory的路径..。

models.setDirectory(__dirname +‘/models’).bind(.)

票数 0
EN

Stack Overflow用户

发布于 2017-08-18 20:07:47

这是由于代码的非阻塞性质,它试图在加载模型之前执行保存。

我遇到了类似的问题&只是为了测试目的,我在测试脚本中设置了超时,然后执行保存和数据插入非常好。

我做了这样的事:

代码语言:javascript
复制
setTimeout(function(){ client.save(model.instance.person,param); }, 3000);
票数 0
EN

Stack Overflow用户

发布于 2019-05-05 22:26:28

您应该使用bind的回调函数,如下所述:Express Cassandra Auto-Load Models from a Directory - models.instance.Person is not a constructor

代码语言:javascript
复制
models.setDirectory( __dirname + '/models').bind(
{
...
},
function(err) { // add your code here }
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41467409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档