TypeError: object不是一个函数"在Node中,当对象定义清楚时
Getting weird "TypeError: object is not a function" in Node, when the object is clearly defined
我正在构建一个在Node.js平台上运行的简单的JavaScript服务器。服务器接受JavaScript对象,解析它们,并根据发现的内容执行命令;相当简单的东西。我称这些对象为Envelopes
(因为你在现实生活中打开信封并根据它们所说的做事情)。明白了吗?我很聪明。
我有3个文件被称为:server.js
, envelope.js
和user-handler.js
。在我的测试中,用户发送一个"用户"信封供服务器解析,最终服务器创建一个新用户并将其添加到我在本地设置的MongoDB实例中。
然而,在user-handler.js
,我遇到了一个奇怪的错误:TypeError: object is not a function
。我不知道为什么我得到这个错误,因为Envelope
对象肯定是正确导入的。您将在下面找到有问题的3个文件。任何和所有的答案都非常感谢!
Server listening on port 31337
Accepted input from user...
Opened up the envelope...
[Function: Envelope]
Envelope verified successfully
It's a 'user' command...
Starting to parse the envelope...
Going to create a new user...
Now to save new user...
/home/ME/PROJECT/lib/user-handler.js:52
console.log(new Envelope({
^
TypeError: object is not a function
at Object.module.exports.parseEnvelope (/home/ME/PROJECT/lib/user-handler.js:52:19)
at Envelope.open (/home/ME/PROJECT/lib/envelope.js:34:28)
at Socket.<anonymous> (/home/ME/PROJECT/lib/server.js:22:22)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:720:14)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:392:10)
at emitReadable (_stream_readable.js:388:5)
at readableAddChunk (_stream_readable.js:150:9)
at Socket.Readable.push (_stream_readable.js:113:10)
server.js
"use strict";
var net = require("net")
, mongoose = require("mongoose")
, dbConf = require("../conf")
, Envelope = require("./envelope")
, UserHandler = require("./user-handler")
, uri, db, server;
uri = (dbConf.uri || "mongodb://localhost") // URI
+ (":" + (dbConf.port || 27017) + "/") // Port
+ (dbConf.db || "DATABASE"); // Database
db = mongoose.connect(uri);
server = net.createServer(function(socket) {
socket.on("data", function(data) {
var input, output;
//try {
input = new Envelope(JSON.parse(data.toString()));
console.log("Accepted input from user...");
output = input.open();
console.log("And the output is: ");
/*} catch (error) {
var errorString = String(error).split(": ");
output = new Envelope({
header: {
type: "error"
},
body: {
errorType: errorString[0],
errorMessage: errorString[1]
}
});
}*/
console.log(JSON.stringify(output));
});
});
server.listen(31337, function() {
console.log("Server listening on port 31337");
});
envelope.js
"use strict";
var userHandler = require("./user-handler");
var Envelope = function Envelope(data) {
for (var key in data) {
this[key] = data[key];
}
};
Envelope.prototype = {
constructor: Envelope,
verify: function() {
console.log(this.constructor);
if (this.header && this.header.type && this.body) {
console.log("Envelope verified successfully");
return true;
} else {
console.log("Envelope did not verify successfully");
return false;
}
},
open: function() {
var self = this;
console.log("Opened up the envelope...");
if (self.verify()) {
switch (self.header.type) {
case "user":
console.log("It's a 'user' command...");
return userHandler.parseEnvelope(self);
break;
default:
return new Envelope({
header: {
type: "empty"
}
});
}
} else {
return new Envelope({
header: {
type: "error"
},
body: {
errorType: "MissingDataError",
errorMessage: "Missing either: header, body, or header.type"
}
});
}
}
};
module.exports = Envelope;
user-handler.js
"use strict";
var User = require("../models/user")
, Envelope = require("./envelope");
module.exports = {
parseEnvelope: function(env) {
var header = env.header;
var body = env.body;
console.log("Starting to parse the envelope...");
switch (header.method) {
case "create":
console.log("Going to create a new user...");
var newName = body.name || {
first: "",
last: ""
};
var newUser = new User({
username: body.username,
password: body.password,
name: newName,
email: body.email || ""
});
console.log("Now to save new user...");
/*newUser.save(function(err) {
if (err) {
console.log("Ruh roh, there was an error...");
console.log(String(err));
} else {
console.log("New user saved successfully to the database...");
return newUser;
}
});*/
/*var response = new Envelope({
header: {
type: "response",
requestType: "user",
requestMethod: "create"
},
body: {
_id: newUser._id,
username: newUser.username,
password: newUser.password,
name: newUser.name,
email: newUser.email
}
});*/
console.log(new Envelope({
test: "Hello, world!"
}));
//console.log(response);
break;
default:
return new Envelope({
header: {
type: "error"
},
body: {
error: "MissingHeaderMethodError",
errorMessage: "Missing header parameter: method"
}
});
break;
}
}
};
测试/user.js
"use strict";
var net = require("net")
, client;
client = net.connect({host: "localhost", port: 31337}, function() {
client.end(JSON.stringify(
{
"header": {
"type": "user",
"method": "create"
},
"body": {
"username": "john_doe",
"password": "password1",
}
}
));
});
问题可能是您使用了循环导入。信封导入用户处理程序,用户处理程序导入信封。由于Envelope"只是"一个信封,它可能不应该知道用户处理程序。所以你可以用下面的方式重构它:
Envelope.js
open: function(callback) {
var self = this;
console.log("Opened up the envelope...");
if (self.verify()) {
switch (self.header.type) {
case "user":
console.log("It's a 'user' command...");
return callback(self);
break;
default:
return new Envelope({
header: {
type: "empty"
}
});
}
} else {
return new Envelope({
header: {
type: "error"
},
body: {
errorType: "MissingDataError",
errorMessage: "Missing either: header, body, or header.type"
}
});
}
}
server.js
output = input.open(UserHandler.parseEnvelope);
现在你不需要在你的Envelope.js中导入你的user-handler.js,一切都应该运行得很顺利。
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 如何使用 node.js 比较两个 json 数组
- Node.js's Buffer.writeFloatBE in Javascript
- node.js:setInterval()正在跳过调用
- 如何处理node.js节点mongodb中的连接和查询队列
- Node.js正在更改应用程序以使用集群模块
- 如何使用Node.js最有效地解析网页
- 在openshift node js应用程序中获取请求
- 正在删除node.js中已验证的网站
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 在索引.html和应用.js [node.js] 之间共享变量
- Node.js中的JavaScript原型对象效率
- 如何在构建node-webkit应用程序后获取外部资源
- node.js请求数据事件未在CORS ajax调用中触发
- 使用node.js制作网站
- 使用Angular和Node上传文件
- 使用node.js服务器中的evernote api获取note内容
- 有没有任何方法可以使用node-js从不同的机器打开浏览器
- node-webkit-从父窗口捕获iframe鼠标事件
- TypeError: object不是一个函数"在Node中,当对象定义清楚时