首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复未捕获的TypeError:无法读取节点中null的属性'id‘?

如何修复未捕获的TypeError:无法读取节点中null的属性'id‘?
EN

Stack Overflow用户
提问于 2019-03-25 01:45:02
回答 1查看 2K关注 0票数 0

我正在尝试创建一个使用节点,ember和mongodb的网页应用程序,这是能够编辑或删除我的数据库中现有的歌曲,网页已经能够显示歌曲和添加新的。当我点击一首歌曲旁边的“编辑”链接时,问题就出现了--它抛出“未捕获的TypeError:无法读取空的属性' id‘”,而它应该通过它的id为我获取一首歌曲。

下面是我的app/routes.js代码:

代码语言:javascript
复制
...
router.route('/songs/:song_id')
 .put(function(req, res) { songs.updateSong(req, res, req.params.song_id) })
 .delete(function(req, res) { songs.deleteSong(req, res, req.params.song_id) });
...

下面是我的api/song.js代码:

代码语言:javascript
复制
...
module.exports.findById = function(req, res) {
  console.log(req.params.id);
  Song.findById(req.params.id ,function(err, data){
    if(err){console.log(err);}
    console.log(data);
    return res.send({
      song: data
    });
  });
};
...

下面是我的app/router.js代码:

代码语言:javascript
复制
...
var SongSchema = new mongoose.Schema({
  title: String,
  artist: String,
  year: Number,
  genre: String,
  lyrics: String
});
...
app.get('/api/songs/:id', function(req, res){
  console.log(req.params.id);
  Song.findById(req,res ,function(err, docs){
    if(err) res.send({error:err});
    else res.send({data:docs, "Song":"song"});
  });
});
...

模板/song.hbs

代码语言:javascript
复制
...
{{#each model as |song|}}
  <li>
    <b>{{song.artist}} - {{song.title}}  {{#link-to 'edit' song.id}}EDIT{{/link-to}} </b><br>
    ID:<i>{{song._id}}</i> <br>
    Released: {{song.year}} <br>
    Genre: {{song.genre}} <br>
    Lyrics:<br> "{{song.lyrics}}"<br><br>
   </li>
{{/each}}
...

下面是我的控制器/edit.js

代码语言:javascript
复制
...

export default Ember.Controller.extend({
  actions: {
    save: function() {
      var d = this.get('model');
      d.save();
      this.transitionToRoute('song');
    },
    del: function() {
      this.get('model').deleteRecord();
      this.transitionToRoute('song');
      this.get('model').save();
    }
  }
});
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 02:22:51

从你那里得到GitHub链接后,我发现你在代码中有错误,导致未知的行为。

只需将app/routes.js替换为以下内容:

代码语言:javascript
复制
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const SongsController = require('../api/songs');

const SongSchema = new mongoose.Schema({
  title: String,
  artist: String,
  year: Number,
  genre: String,
  lyrics: String
});

const Song = mongoose.model('song', SongSchema);

module.exports = (app) => {

  app.get('/api/songs', async (req, res) => {
    try {
      const songs = await Song.find({}).lean();
      res.status(200).send({songs});
    } catch(error) {
      res.status(500).send({
        message: error.message
      });
    }
  });

  app.get('/api/songs/:id', async (req, res) => {
    try {
      const song = await Song.findById(req.params.id).lean();
      if(!song) {
        return res.status(404).send({
          message: "Song not found",
          params: req.params
        });
      }
      res.status(200).send({song});
    } catch(error) {
      res.status(500).send({
        message: error.message
      });
    }
  });


  app.use(bodyParser.urlencoded({extended: false}));

  app.post('*', SongsController.addSong);
};

附注:快速修复只是将处理传递给已经编写的SongsController.findById方法:

代码语言:javascript
复制
app.get('/api/songs/:id', SongsController.findById);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55326671

复制
相关文章

相似问题

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