2017-08-11 1 views
0

In meiner Funktion "reqHandler" sammle ich Formulardaten und gebe sie in meine http.request. Um Anfragen zu ketten, habe ich einen Promise- und Then-Handler deklariert. Problem ist, dass: 1. Dies wird in die Konsole geschrieben "Unhandled Versprechen Ablehnung (Ablehnung ID: 2): TypeError: Kann Eigenschaft 'URL' von undefined" 2. Es scheint wie. Dann wird nicht aufgerufen, also keine API-Aufrufe werden hergestellt.Verketten von http-Anfragen mit Versprechen

Code:

"use strict"; 

const http  = require("http"); 
const qs   = require("querystring"); 
const fs   = require("fs"); 
const PORT  = 3000; 

let resObject = {}; 
let hash = ""; 

const options = { 
    hostname: "netology.tomilomark.ru", 
    path: "/api/v1/hash", 
    method: "post" 
}; 

const reqHandler = (req, res) => { 
    return new Promise((resolve, reject) => { 
    if (req.url === "/") { 
     switch (req.method.toLowerCase()) { 
     case "get": 
      // Browse my form with "Name" and "Surname" inputs 
      fs.readFile("./logs/form.html", (err, file) => { 
      if (err) { 
       reject("Promise rejected"); 
       return 
      } 
      res.writeHead(200, {'Content-Type': 'text/html','Content-Length':file.length}); 
      res.write(file); 
      res.end(); 
      }); 
      break; 
     case "post": 
      // Collect form data and parse it using querystring 
      let body = ""; 
      req.setEncoding("utf8"); 
      req.on("data", (data) => { 
      body += data; 
      if (body.length > 1e6) 
       req.connection.destroy(); 
      }); 
      req.on("end",() => { 
      let post = qs.parse(body); 
      console.log(post); 
      options.headers = { 
       "Content-Type": "application/json", 
       "firstname": `${post.firstName}` 
      }; 
      options.body = { 
       "lastname": `${post.lastName}` 
      }; 
      // Resolve with "options" object that has headers and body 
      resolve(options); 
      }); 
      break; 
     default: 
      badRequest(res); 
     } 
    } else { 
     notFound(res); 
    } 
    }); 
}; 

reqHandler() 
    .then((options) => { 
    http.request(options, (res) => { 
     let resString = ""; 
     res.on("data", (data) => { 
     resString += data; 
     }); 
     res.on("end",() => { 
     console.log(resString); 
     }); 
     res.end(); 
    }); 
    }) 
    .catch(err => {throw err}); 

let badRequest = (res) => { 
    res.statusCode = 400; 
    res.setHeader('Content-Type', 'text/plain'); 
    res.end('Bad Request'); 
}; 

let notFound = (res) => { 
    res.statusCode = 404; 
    res.setHeader('Content-Type', 'text/plain'); 
    res.end('Not Found'); 
}; 

const server = http.createServer(); 
server.on("error", (err) => console.error(err)); 
server.on("request", reqHandler); 
server.on("listening",() => console.log(`Start HTTP on port ${PORT}`)); 
server.listen(PORT); 

Letztlich, was noch falsch mit meinem Versprechen und .then? Jede Hilfe wird geschätzt!

+0

Was ist das Problem, das Sie sehen? Schnell vorschlagen. Sie können die 'request-promise'-Bibliothek verwenden, die ein Wrapper um das Anforderungsmodul – Rowland

+0

ist Anstatt zu testen, ob (req.url ==="/")' und 'case" get "/ case" post "' sollten Sie implementieren ein Router ... 'app.get ("/"), app.post ("/")', solltest du nicht? –

+4

'reqHandler()' erwartet zwei Parameter, aber Sie rufen sie ohne Argumente auf. – PeterMader

Antwort

1

Ok Ich habe eine Testumgebung erstellt und hier haben Sie eine abstrakte Version Ihrer Quelle. Ihre Fehler war es, Ihr Versprechen in einer Funktion, die die Parameter req und res übergeben, und Sie müssen in Ihrem Versprechen zu lösen oder abzulehnen, was an mehreren Stellen vergessen wurden.

Diese Quelle wurde getestet!

const http = require('http'); 

const reqHandler = (req, res) => { 
    return new Promise((resolve, reject) => { 
    if (req.url === "/") { 
     switch (req.method.toLowerCase()) { 
     case "get": 
      console.log('get'); 
      return resolve('get'); 
     case "post": 
      console.log('post'); 
      return resolve('post'); 
     default: 
      return resolve('default'); 
     } 
    } else { 
     return resolve('some thing else'); 
    } 
    }); 
}; 

const myReqHandler = (req, res) => { 
    reqHandler(req, res).then(()=> { 
     console.log('then reached') 
    }); 
} 


const PORT = 8089; 
const server = http.createServer(); 
server.on("error", (err) => console.error(err)); 
server.on("request", myReqHandler); 
server.on("listening",() => console.log(`Start HTTP on port ${PORT}`)); 
server.listen(PORT); 
+0

Angepasst Ihren Code an meine Aufgabe, keine Probleme mit Versprechen und seine Handler. Das nächste Mal werde ich vorsichtiger sein über die Auflösung und ablehnen .. Vielen Dank! –

Verwandte Themen