问个关于N-blog中使用Nodejs的一个问题。

问个关于N-blog中使用Nodejs的一个问题。

N-blog中取数据是User.get方法,但我改用User.prototype.get就报错了(用User.get是正常的),一下子不懂了。

  Express
500 TypeError: Object function User(user) {
   this.name = user.name;
   this.password = user.password;
   this.email = user.email;
} has no method 'get'
   this.name = user.name;
   this.password = user.password;
   this.email = user.email;
} has no method 'get'
   at /Users/shidoudou/Documents/dev1/node/blog/routes/index.js:33:14
   at callbacks (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/lib/router/index.js:164:37)
   at param (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/lib/router/index.js:138:11)
   at pass (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/lib/router/index.js:145:5)
   at Router._dispatch (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/lib/router/index.js:173:5)
   at Object.router (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/lib/router/index.js:33:10)
   at next (/Users/shidoudou/Documents/dev1/node/blog/node_modules/express/node_modules/connect/lib/proto.js:169:15)
   at /Users/shidoudou/Documents/dev1/node/blog/node_modules/express/node_modules/connect/node_modules/express-session/index.js:314:9
   at /Users/shidoudou/Documents/dev1/node/blog/node_modules/connect-mongo/lib/connect-mongo.js:222:17
   at /Users/shidoudou/Documents/dev1/node/blog/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/collection/query.js:147:5

4 回复

根据你提供的信息,问题出在 User 类的方法定义上。你原本使用的是静态方法 User.get,但后来改用了原型方法 User.prototype.get,这导致了错误。

解释

  • 静态方法 (User.get) 是直接定义在构造函数上的方法。例如:

    function User(user) {
      this.name = user.name;
      this.password = user.password;
      this.email = user.email;
    }
    
    // 静态方法
    User.get = function(id) {
      // 获取用户逻辑
    };
    
  • 原型方法 (User.prototype.get) 是通过原型链继承的方法。例如:

    function User(user) {
      this.name = user.name;
      this.password = user.password;
      this.email = user.email;
    }
    
    // 原型方法
    User.prototype.get = function(id) {
      // 获取用户逻辑
    };
    

示例代码

假设你有一个简单的 User 类,并且你想使用原型方法来获取用户信息。以下是正确的代码示例:

function User(user) {
  this.name = user.name;
  this.password = user.password; // 注意密码通常不建议明文存储
  this.email = user.email;
}

// 定义原型方法
User.prototype.get = function(id, callback) {
  const users = [
    { id: 1, name: 'Alice', password: 'pass123', email: 'alice@example.com' },
    { id: 2, name: 'Bob', password: 'pass456', email: 'bob@example.com' }
  ];

  const user = users.find(u => u.id === id);
  if (user) {
    callback(null, user);
  } else {
    callback(new Error('User not found'), null);
  }
};

// 在路由中调用
const express = require('express');
const app = express();

app.get('/user/:id', (req, res) => {
  const userId = req.params.id;
  
  User.prototype.get(userId, (err, user) => {
    if (err) {
      return res.status(500).send(err.message);
    }
    res.json(user);
  });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

关键点

  1. 原型方法 (User.prototype.get) 必须通过实例或原型链调用。
  2. 确保在调用时正确引用原型方法。

希望这个示例能帮助你理解并解决你的问题。


简单来说prototype是在User的原型中添加方法,User.get是在User对象中添加方法 具体的表现为,如果是在原型中添加的方法,那这个方法需要创建一个User对象才可以调用到,比如

User.prototype.get = function() {
  //...do something
}
var newUser = new User();
newUser.get();

如果没有prototype,那么这个方法就是User的方法,可以直接调用,比如

User.get = function() {
  //.. do something
}
User.get();

这只是从应用角度简单说了下,建议楼主可以看看JavaScript的面向对象部分,这应该是属于基础的知识~

谢谢,明白了,十分感谢

根据你提供的错误信息,TypeError: Object function User(...) has no method 'get' 表明 User 对象上没有定义 get 方法。你在尝试通过原型链的方式给 User 类添加 get 方法时出现了问题。

当你使用 User.get 调用静态方法时,Node.js 可以正常运行。但是当你改为使用原型方法 User.prototype.get 时,却报错说 User 没有 get 方法。

示例代码

首先定义一个简单的 User 类,并通过原型链方式添加 get 方法:

function User(user) {
    this.name = user.name;
    this.password = user.password;
    this.email = user.email;
}

// 使用原型链添加 get 方法
User.prototype.get = function() {
    return {
        name: this.name,
        email: this.email
    };
};

// 测试代码
const newUser = new User({
    name: "John Doe",
    password: "password123",
    email: "john@example.com"
});

console.log(newUser.get()); // 应输出 { name: 'John Doe', email: 'john@example.com' }

原因分析

确保你正确地通过原型链添加了 get 方法。如果你将 get 方法直接定义在构造函数上而不是原型链上,可能会导致混淆:

// 错误的示范:直接在构造函数上定义 get 方法
User.get = function() {
    // 这里你无法访问到实例属性,因为 this 指向的是构造函数本身,而不是实例对象
};

调试建议

  • 确保在调用 new User(...) 后实例化了 User 对象。
  • 确认在实例化后是否正确调用了 get 方法。

如果你仍然遇到问题,请检查你的文件路径、模块引入以及相关依赖项,确保它们与 N-blog 的文档一致。

回到顶部