【问题标题】:node.js redirection not working to add usernamenode.js 重定向无法添加用户名
【发布时间】:2015-04-05 19:51:34
【问题描述】:

我正在开发一个使用 Node.js 构建动态网站的 Team Treehouse 项目。用户在搜索字段中输入用户名,它会显示用户的头像、获得的徽章数量和 JavaScript 点数。出于某种原因,当我输入用户名并单击搜索时,页面只是空白。我认为我的 router.js 文件中的 303 重定向可能有问题。我对编码还很陌生,所以任何见解都会非常有帮助。这是我的每个js文件。

/*****app.js 文件******/

var router = require('./router.js');

//Problem: We need a simple way to look at a user's badge count and JavaScript points from a web browser
//Solution: Use Node.js to perform the profile look ups and serve our templates via HTTP

//Create a web server
var http = require('http');
http.createServer(function (request, response) {
  router.home(request, response);
    router.user(request, response);
}).listen(3000);
console.log('Server running at http://<workspace-url>');

/*****router.js 文件******/

var Profile = require("./profile.js");
var renderer = require('./renderer');
var querystring = require('querystring');

var commonHeader = {'Content-Type': 'text/html'};

// Handle the HTTP route GET / and POST / i.e. Home
function home(request, response) {
	//if url == "/" && GET
	if (request.url === '/'){
    if (request.method.toLowerCase() === "get") {
      //show search
      console.log(request.url);
      response.writeHead(200, commonHeader);
      renderer.view('header', {}, response);
      renderer.view('search', {}, response);
      renderer.view('footer', {}, response);
      response.end();
    } 
    else {
      //if url == "/" && POST
      
      //get the post data from body
      request.on('data', function(postBody){
        //extract the username  
        var query = querystring.parse(postBody.toString());
        //redirect to /:username
        response.writeHead(303, {'Location': '/' + query.username });
        response.end();
      });
    }
  }
}
  

// Handle the HTTP route for GET /:username i.e. /chalkers
function user(request, response) {
  //if url == "/...."
	var username = request.url.replace('/', '');
	if(user.name.length > 0){
		response.writeHead(200, commonHeader);
    renderer.view('header', {}, response);
		
		//get json from Treehouse
		var studentProfile = new Profile(username);

		//on "end"
		studentProfile.on("end", function(profileJSON){
			//show profile
			
			//Store the values which we need
			var values = {
				avatarUrl: profileJSON.gravatar_url,
				username: profileJSON.profile_name,
				badges: profileJSON.badges.length,
				javascriptPoints: profileJSON.points.JavaScript
			}
			//Simple response
			renderer.view('profile', values, response);
			renderer.view('footer', {}, response);
      response.end();
			
		});
      
		//on "error"
		studentProfile.on("error", function(error){
			//show error
			renderer.view('error', {errorMessage: error.message}, response);
      renderer.view('search', {}, response);
			renderer.view('footer', {}, response);
      response.end();
		});		
	}
}

module.exports.home = home;
module.exports.user = user;

/*****profile.js 文件*******/

var EventEmitter = require("events").EventEmitter;
var http = require("http");
var util = require("util");

/**
 * An EventEmitter to get a Treehouse students profile.
 * @param username
 * @constructor
 */
function Profile(username) {

    EventEmitter.call(this);

    profileEmitter = this;

    //Connect to the API URL (http://teamtreehouse.com/username.json)
    var request = http.get("http://teamtreehouse.com/" + username + ".json", function(response) {
        var body = "";

        if (response.statusCode !== 200) {
            request.abort();
            //Status Code Error
            profileEmitter.emit("error", new Error("There was an error getting the profile for " + username + ". (" + http.STATUS_CODES[response.statusCode] + ")"));
        }

        //Read the data
        response.on('data', function (chunk) {
            body += chunk;
            profileEmitter.emit("data", chunk);
        });

        response.on('end', function () {
            if(response.statusCode === 200) {
                try {
                    //Parse the data
                    var profile = JSON.parse(body);
                    profileEmitter.emit("end", profile);
                } catch (error) {
                    profileEmitter.emit("error", error);
                }
            }
        }).on("error", function(error){
            profileEmitter.emit("error", error);
        });
    });
}

util.inherits( Profile, EventEmitter );

module.exports = Profile;

/*****renderer.js 文件*******/

var fs = require('fs');

function mergeValues(values, content) {
  //Cycle over the keys 
  for(var key in values) {
    //Replace all the {{key}} with the value from the values object
    content = content.replace('{{' + key + '}}', values[key]);
  }
  //return merged content
  return content;
}

function view(templateName, values, response) {
  //Read from the template file
  var fileContents = fs.readFileSync('./views/' + templateName + '.html', {encoding: 'utf8'});
  //Insert values in to the content
  fileContents = mergeValues(values, fileContents);
  //Write out the contents to the response
  response.write(fileContents);
}

module.exports.view = view;

【问题讨论】:

    标签: javascript node.js http-headers


    【解决方案1】:

    Treehouse 从 http 更改为 https,因此此示例代码不再有效。原因在于 profile.js 文件中。您正在调用一个 http 站点,但它不存在。您需要更改代码(仅在 profile.js 中)以使其连接到 https 站点。

    var http = require("http");
    

    应该改为

    var https = require("https");
    

    因此,您的 profile.js 代码中对变量的所有引用都应更改为 https。

    以及硬编码的 URL 开头:

    var request = http.get("http://teamtreehous...    
    

    应该是

    var request = https.get("https://teamtreehous...
    

    这应该可以解决问题。祝你好运!

    【讨论】:

      【解决方案2】:

      为了让 profile.js 文件中的代码运行,您需要将“http”模块的一些实例更改为“https”,但这很重要,并非全部实例。

      需要保留http的是profile.js页面上的状态码错误。这行代码是正确的:

      profileEmitter.emit("error", new Error("There was an error getting the profile for " + username + ". (" + http.STATUS_CODES[response.statusCode] + ")"));
      

      但是 http 模块的所有其他实例都需要更改为 https。例如,这些行是正确的:

      var url = "https://teamtreehouse.com/" + username + ".json";
      
      var request = https.get(url, function(response){    
      

      记得在 profile.js 页面的顶部 require 两个模块

      var http = require("http");
      var https = require("https");
      

      【讨论】:

        猜你喜欢
        • 2013-09-10
        • 1970-01-01
        • 2021-07-09
        • 2020-09-09
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多