تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ سعید ریحانی
دریافت خطا در وبسرور
جامعه نود جی اس ایجاد شده در ۲۳ مرداد ۱۴۰۰

سلام

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

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'
}

 

ممنون

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

کیوان علی محمدی ۲۵ مرداد ۱۴۰۰، ۰۶:۳۸