Node.js TypeError:无法读取未定义的属性“作者”

Posted

技术标签:

【中文标题】Node.js TypeError:无法读取未定义的属性“作者”【英文标题】:Node.js TypeError: Cannot read property 'author' of undefined 【发布时间】:2021-05-11 08:43:48 【问题描述】:

(已更新)

问题: 我无法返回我所有的测试数据(如图所示) No data show up 我期望的应该是->

"data":["id": 1,"title": "title A","content": "content A","createTime": 1612708329045,"author": "Alisa", "id": 2,"title": "title B","content": "content B","createTime": 1612708333855,"author": "Alisa"],"errno":0


来自终端的错误消息:

PS C:\Users\jiann\Desktop\JS\Nodejs> node www.js
internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module 'C:\Users\jiann\Desktop\JS\Nodejs\www.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47 
  code: 'MODULE_NOT_FOUND',
  requireStack: []



我不知道哪里出错了:(。 如果需要更多详细信息,请告诉我,感谢您的帮助!

我的代码如下:

代码块 1 说明: 如果成功获取数据和消息,显示“errno”:0,如果没有,则显示“errno”:-1

class BaseModel 
        constructor(data, message) 
            if (typeof data === 'string') 
                this.message = data
                data = null
                message = null
            
            if (data) 
                this.data = message
            
            if (message) 
                this.message = message
            
        
    
    class SuccessModel extends BaseModel 
        constructor(data, message) 
            super(data, message)
            this.errno = 0
        
    
    class ErrorModel extends BaseModel 
        constructor(data, message) 
            super(data, message)
            this.errno = -1
        
    
    module.exports = 
        SuccessModel,
        ErrorModel
    

代码块 2 说明:

为我的博客和用户设置路由器。该代码块将设置JSON数据格式,设置URL路径,解析查询,如果没有找到路由器,则返回404。

const querystring = require('querystring')
    const handleBlogRouter = require('./blog-1/src/router/blog')
    const handleUserRouter = require('./blog-1/src/router/user')

    const serverHandle = (req, res) => 
        // set JSON
        res.setHeader('Content-type', 'application/json')

        //get path
        const url = req.url
        req.path = url.split('?')[0]

        //parse query
        req.query = querystring.parse(url.split('?')[0])

        //set blog router
        const blogData = handleBlogRouter(req, res)
        if (blogData) 
            res.end(
                JSON.stringify(blogData)
            )
            return
        

        //set user router
        const userData = handleUserRouter(req, res)
        if (userData) 
            res.end(
                JSON.stringify(userData)
            )
            return
        
        
        //no router
        res.writeHead(404, "Content-type": "text/plain")
        res.write("404 Not Found\n")
        res.end()
    

    module.exports = serverHandle


代码块 3 说明: 使用 GET 和 POST 要求来自路径的数据 -> '/api/博客/列表' '/api/博客/详细信息' '/api/博客/新的' '/api/博客/更新' '/api/blog/del'

const  getList, getDetail  = require('../controller/blog')
    const  SuccessModel, ErrorModel  = require('../model/resModel')

    const handleBlogRouter = (req, res) => 
        const method = req.method // GET POST
        

        
        if (method === 'GET' && req.path === '/api/blog/list') 
            const author = req.query.author || ''
            const keyword = req.query.keyword || ''
            const listData = getList(author, keyword)
            return new SuccessModel(listData)
        

        
        if (method === 'GET' && req.path === '/api/blog/detail') 
            const id = req.query.id
            const data = getDetail(id)
            return new SuccessModel(data)
        

        
        if (method === 'POST' && req.path === '/api/blog/new') 
            return 
                msg: 'dummy'
            
        

        
        if (method === 'POST' && req.path === '/api/blog/update') 
            return 
                msg: 'dummy'
            
        

        
        if (method === 'POST' && req.path === '/api/blog/del') 
            return 
                msg: 'dummy'
            
        
    

    module.exports = handleBlogRouter)

代码块 4 说明: 这是我的两个测试数据。

const getList = (author, keyword) => 
        //fake data
        return [
            
                id: 1, 
                title: 'title A',
                content: 'content A',
                createTime: 1612708329045,
                author: 'Alisa'
            ,
            
                id: 2, 
                title: 'title B',
                content: 'content B',
                createTime: 1612708333855,
                author: 'Amanda'
            
        ]
    

    module.exports = 
        getList
    )

【问题讨论】:

嗨@Jiann。感谢您发布此信息。您能否查看Minimal, Reproducible Example guide 并更新您的问题。您在这里包含了很多代码,但不清楚问题出在哪里。 此外,您在标题中提到的错误消息()未在您的问题中提及。请简化问题以说明您何时何地收到此错误。 嗨@James 感谢您的建议!抱歉,我在面对这个问题时有点恐慌,这是我在 *** 上的第一篇文章......我整理了我的问题,希望它更容易理解。 没问题建恩。看起来您现在有了一些答案,所以我想这些改进有所帮助。感谢您的提问! @James 其实我还没有弄清楚这个问题...你能帮我指出我的代码问题在哪里吗? 【参考方案1】:

此错误表示您正在访问<?>.author,但<?>undefined

例如,如果您的错误在这里:

    if (method === 'GET' && req.path === '/api/blog/list') 
        const author = req.query.author || ''
//      ^^^ TypeError: Cannot read property 'author' of undefined
        const keyword = req.query.keyword || ''

这意味着req.queryundefined。如果有机会会出现,您可以使用可选链接

let foo = undefined;

foo.bar; // TypeError: Cannot read property 'bar' of undefined
foo?.bar; // => undefined
foo?.bar.baz; // TypeError: Cannot read property 'baz' of undefined
foo?.bar?.baz; // => undefined

【讨论】:

我更新了我的问题并添加了更多细节,希望它可以帮助您理解我的问题。感谢您的帮助【参考方案2】:

错误是因为您的服务器没有正确启动,所以您期望的所有这些值都将不可用。你用什么命令启动服务器?

【讨论】:

我只是输入了“node www.js”来启动终端上的服务器。 www.js 是我创建的名称。

以上是关于Node.js TypeError:无法读取未定义的属性“作者”的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Discord.js UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“calculatedPosition”

Node.js TypeError:无法读取未定义的属性“作者”

Node.js TypeError无法读取未定义的属性objectId

Node.js 和 jdbc:TypeError:无法读取未定义的属性“url”

Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性

错误:TypeError:尝试为网站 node.js 注册用户时无法读取未定义的属性“catch”