node.js express环境下中文需要注意的地方
问题一:
最近在nuxt项目中开始着手把一些跨域的请求转移到express里,其实跟其他语言差不多,http对象发请求,接收请求都写得很顺畅。之前用的请求部分大多数是get请求,所以除了注意编码问题之外,就基本上接口什么写得很快,但是POST请求里由于要计算Content-Length,这里就出现一个由于中文计算长度有问题导致的请求失败。
var bodyString = JSON.stringify(obj)
var options = {
method: 'POST',
host: 'mt.emoney.cn',
port: 80,
path: `*********`,
headers: {
'Content-Type': 'application/json;charset=utf-8',
'Content-Length': bodyString.length
}
}
上面这样发起请求时,如果obj对象里面有属性里面包含了中文,bodyString.length就计算有问题,以下标红的是一种方案。
var bodyString = JSON.stringify(obj)
bodyString = new Buffer(bodyString)
var options = {
method: 'POST',
host: 'mt.emoney.cn',
port: 80,
path: `/platform/stock/MarkStock`,
headers: {
'Content-Type': 'application/json;charset=utf-8',
'Content-Length': bodyString.length
}
}
这里还有另一种获取长度的方案。
Buffer.byteLength(data, 'utf8');
问题二:
基本上我在网上找了一段获取请求内容并输出的代码是这样的,options部分先省略
var cusRequest = http.request(options, back => {
if (back.statusCode === 200) {
var body = ''
back.on('data', data => {
body += data
}).on('end', () => {
res.status(200).send(body)
})
} else {
res.status(500).send('error')
}
})
cusRequest.end()
用body进行字符串的拼接,这里的data我输出来看了一下,是个Buffer数据,因为是一段一段的,它默认先转换为字符串拼接到body后面,但是中文可能有点不太一样,一旦中间的某个中文字符串刚好被前后两个data截断,那么就会出现一大段中文中某几个字变成乱码,所以这里不能用字符串进行拼接,得直接用Buffer拼接好后在进行转换为中文。如下面代码所示:
var cusRequest = http.request(options, back => {
if (back.statusCode === 200) {
var bufs = []
back.on('data', data => {
bufs.push(data)
}).on('end', () => {
var buf = Buffer.concat(bufs)
res.status(200).send(buf.toString())
})
} else {
res.status(500).send('error')
}
})
cusRequest.end()
node.js express环境下中文需要注意的地方的更多相关文章
- mac下配置Node.js开发环境、express安装、创建项目
mac下配置Node.js开发环境.express安装.创建项目 一.node.js的安装 去官网下载对应的平台版本就可以了,https://nodejs.org 二.express安装 sudo n ...
- Windows下Node.js+Express+WebSocket 安装配置
Linux参考: Linux安装Node.js 使用Express搭建Web服务器 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V ...
- windows下安装node.js及环境配置、部署项目
windows下安装node.js及环境配置.部署项目 一.总结 一句话总结: 安装nodejs软件:就像普普通通的的软件那样安装 配置nodejs安装的全局模块的环境变量 并且安装cnpm(比如cn ...
- Windows下Node.js开发环境搭建
1.http://nodejs.org/下载node.js运行环境安装 2.打开DOS命令行 .安装express框架 1 >npm install express 末尾显示如下为安装成功 .安 ...
- Node.js event loop 和 JS 浏览器环境下的事件循环的区别
Node.js event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...
- Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...
- 微信公众号开发总结(Node.js + express + winston)
关于订阅号.服务号.企业号 官方定位 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式. 服务号:主要偏于服务交互(类似银 ...
- Nodejs学习笔记(一)—简介及安装Node.js开发环境
一.简介 Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言: Node.js采用的Javascript引擎是来自Google Chrome的V8:运行在浏览器外不用考虑 ...
- modeJS 深了解(1): Node.js + Express 构建网站预备知识
转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...
随机推荐
- t-ora issue can't login mysql
https://github.com/tora-tool/tora/issues/99 ### TOra is an open-source multi-platform database manag ...
- Python metaclasses
metaclasses元类:就像对象是类的实例一样,类是它的元类的实例.调用元类可以创建类. metaclass使用type来创建类,type可以被继承生成新的元类. 这个和C#的反射很相似. 下面是 ...
- javaweb项目导入myecplise出错
项目导入出错:移动项目的时候.classpath .project不要删 build path -> use for source floder 把某一文件夹当作源码文件夹 bulid path ...
- 白话SpringCloud | 第一章:什么是SpringCloud
前言 作为SpringCloud的正式第一章,我们先来简单了解下SpringCloud相关知识点吧,内容可能比较多. 何为微服务 传统单体架构 服务化架构 微服务架构 什么是SpringCloud 核 ...
- 从零开始的全栈工程师——js篇2.4
条件语句与循环语句 变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window ,window分两个模块,一个叫内存模块,一个叫运行模块,内存模块找到当前作 ...
- 学习笔记:MDN的服务器端网站编程
互联网是如何工作的 互联网(Internet)和网络(web) 互联网是基础设施,网络是建立在这种基础设施之上的服务. 网页,网站,网络服务器和搜索引擎的区别是什么? 网页(webpage) 一份能够 ...
- CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
转自:http://www.cnblogs.com/frontendBY/p/5215785.html 1.UTC: Universal Time Coordinated 协调世界时,又称世界标准时间 ...
- Asp.net MVC 服务端验证多语言错误
服务端验证用户提交信息时为了实现多语言使用了资源文件,如: using System.ComponentModel.DataAnnotations; public class UserModel { ...
- mybatis-动态sql1
在多条件查询的情况下必须用到动态sql 沿用之前的项目 1.在dao中添加多添件查询方法 package com.java1234.mappers; import java.util.List;imp ...
- IOS截取部分图片
截取部分图片这么简单: - (void)loadView { [[UIApplication sharedApplication] setStatusBarHidden:YES withAni ...