دریافت خطا در وبسرور

پرسیده شده
فعالیت 978 روز پیش
دیده شده 365 بار
0

سلام

کد های فایل سرور من که نوشتم به این شکل هست

const http = require('http')
const configs = require('./configs')
const path = require('path')
const queryStringParser = require('qs')
const postDataParser = require('formidable')
const fileServer = require('node-static')
const staticFileServer = new fileServer.Server(configs.publicDir)
const viewFileServer = new fileServer.Server(configs.viewDir)
const controller = require('./controller')

// -----------------
async function getDataFromRequest(request) {
    const promise = new Promise((resolve, reject) => {
        let data = {
            fields: {},
            files: {}
        }
        queryStringFileds = queryStringParser.parse(request.parsUrl.search.split('?')[1])
        if (request.method == 'GET') {
            Object.assign(data.fields, queryStringFileds)
            resolve(data)
        }

        let postData = {
            fields: {},
            files: {}
        }
        let pd = new postDataParser.IncomingForm()
        pd.parse(request, (err, fields, files) => {
            Object.assign(postData.fields, fields)
            Object.assign(postData.files, files)
        })
        pd.on('end', () => {
            Object.assign(data.fields, queryStringFileds, postData.fields)
            Object.assign(data.files, postData.files)
            // console.log(data)
            resolve(data)
        })

    })
    return await promise
}

function getRoutController(request) {
    let rout = request.parsUrl.pathname.split('/')
    return {
        path: rout[1] != undefined ? rout[1] : '',
        controller: rout[2] != undefined ? rout[2] : 'home',
        method: rout[3] != undefined ? rout[3] : 'index'
    }
}
// -----------------


const server = http.createServer((req, res) => {
    req.parsUrl = new URL(path.join(configs.baseUrl, req.url))
    const rout = getRoutController(req)
    getDataFromRequest(req).then(data => {
        if (rout.path == 'api') {
            if (controller[rout.controller] != undefined) {
                if (controller[rout.controller][rout.method] != undefined) {
                    response = controller[rout.controller][rout.method](data)
                    res.writeHead(200, { 'Content-Type': 'application/json' })
                    res.write(JSON.stringify({ status: 1, data: response }), "binary")
                    res.end()
                    return
                }
                res.writeHead(200, { 'Content-Type': 'application/json' })
                res.write(JSON.stringify({ status: 0, message: "Your requested method not Founded...!" }), "binary")
                res.end()
                return
            }
            res.writeHead(200, { 'Content-Type': 'application/json' })
            res.write(JSON.stringify({ status: 0, message: "Your requested api not Founded...!" }), "binary")
            res.end()
            return
        }

        if (rout.path == '') {
            staticFileServer.serveFile('index.html', 200, {}, req, res)
        }

        staticFileServer.serve(req, res, (e) => {
            res.writeHead(404, { 'Content-Type': 'application/json' })
            res.write(JSON.stringify({ file: 'NotFound...!' }), "binary")
            res.end()
            return
        })
    })


})

server.listen(8080, () => {
    console.log("SERVER is running on port 8080...")
})

و حالا دوتا سوال یا مشکل دارم

۱: چرا پردازش رو باید توی then پرومیس گرفتن دیتا انجام بدیم؟ یعنی من اومدم توی then پرومیز ، دیتا رو ریختم توی یک متغییر ولی در خارج از then دیگه دسترسی به اون داده ها نداشتم.

۲: سوال دومم اینه که همه چی اوکی هست ولی وقتی دوبار که رفرش رو میزنم روی یک آدرس ، وسط کار خطای زیر رو میده خواستم ببینم این خطا برای نوع کدنویسی هست یا نه به چیزی دیگه مربوطه؟

events.js:287
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:637:17)
    at ServerResponse.write (_http_outgoing.js:629:15)
    at I:\xampp\htdocs\js\completeFirstApi\server.js:85:17
    at Server.finish (I:\xampp\htdocs\js\node_modules\node-static\lib\node-static.js:128:21)
    at finish (I:\xampp\htdocs\js\node_modules\node-static\lib\node-static.js:170:14)
    at I:\xampp\htdocs\js\node_modules\node-static\lib\node-static.js:337:13
    at streamFile (I:\xampp\htdocs\js\node_modules\node-static\lib\node-static.js:382:13)
    at ReadStream.<anonymous> (I:\xampp\htdocs\js\node_modules\node-static\lib\node-static.js:375:17)
    at ReadStream.emit (events.js:310:20)
    at internal/fs/streams.js:242:14
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:692:7)
    at processTicksAndRejections (internal/process/task_queues.js:85:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}

 

ممنون

فایل پیوست

سعید ریحانی
سعید ریحانی

23 مرداد 00

1
حذف شده

سلام خدمت شما. چون flow انجام درخواست ها به صورت async داره انجام میشه شما باید اول از همه اطلاعات رو parse کنید و سپس از اون اطلاعات استفاده کنید. برای همین باید داخل then اون اطلاعات در دسترس باشه و خارج از اون دیگه در دسترس نیست چون scope اون اطلاعات همون تابع then هستن.در مورد سوال دومتون احتمال زیاد دارین چندین بار header ها رو تنظیم می کنید.

فایل پیوست

کیوان علی محمدی

توسط

کیوان علی محمدی

25 مرداد 00

جلسه یک وب سرور کامل (API + Web view + Http Errors + Gzip + Cache headers)