2017-01-04 3 views
0

CRUD 작업을 수행하기 위해 express-cassandra를 사용하고 있습니다. 서비스를 실행하고 우체국을 사용하여 API를 생성하면 모든 것이 예상대로 작동합니다.오류 "models.instance.QuestionnaireMaster가 생성자가 아닙니다."node.js가있는 express-cassandra

그러나 chai 테스트 케이스를 사용하여 동일한 컨트롤러 함수를 호출 할 때 "models.instance.table은 생성자가 아닙니다."라는 오류 메시지가 표시됩니다.

dbClient.js : 카산드라와 초기화하는 연결

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 : 모델

"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" 
 
}
정의에 따라

코드 조각입니다 16,

questionnaire_master.js : API가 호출되는 경우 호출() 새로운 엔트리

var questionnaireMasterController = {}; 
 
var models = require('../models/dbCLient'); 
 
//var questionnaireMasterModel = require('../models/QuestionnaireMasterModel'); 
 
var responseEntity = require('../utility/response_entity'); 
 

 

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

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

createQuestionnaire를 생성 컨트롤러 기능. 잘 작동합니다. 나를

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에서 호출을 오류 제공 테스트 케이스 :

을 questionnaire_master_test.js. 다음과 같은 오류를 반환 : 모델이로드되지 않을 때

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)

답변

0

그 오류는 일반적으로 발생합니다. 이 경우 models.setDirectory (__ dirname)dbClient.js 파일에 제공된 디렉토리 경로 때문일 수 있습니다. 기본적으로 __dirname은 현재 모듈 디렉토리 (이 경우 dbClient.js가 포함 된 디렉토리)를 가리 킵니다.

귀하의 응용 프로그램 디렉토리 구조가 게시물에서 완전히 명확하지는 않지만 귀하의 모델이 dbClient.js 모듈과 다른 디렉토리에 있다고 생각됩니다. 사실이라면 setDirectory()에 대한 호출을 편집하여 모델 폴더에 대한 올바른 경로를 반영해야합니다.

예를 들어, 앱 구조 인 경우 ...

C : \의 repos \ approot \ dbClient.js

C : \의 repos \ approot \ 모델 QuestionnaireMasterModel을 \.JS

다음

0

이 비 차단 성질에 기인한다 (...). ...

models.setDirectory (__있는 dirname + '/ 모델') setDirectory 제공 경로를 변경 바인딩 코드를 실행하면 모델이로드되기 전에 저장을 실행하려고 시도합니다.

비슷한 문제가 발생했습니다. & 테스트 목적으로 만 테스트 스크립트에서 시간 초과를 설정 한 다음 저장 및 데이터 삽입을 완벽하게 성공적으로 수행했습니다.

setTimeout(function(){ client.save(model.instance.person,param); }, 3000); 
:

내가 이런 짓을

관련 문제