• 关于

    Node.js请求参数

    的搜索结果

问题

NodeJs的Redis客户端遇到failed - connect EMFILE问题

程序很简单,就是得到http请求后,用一个参数作为Key去blpop一个Redis实例,如果超时就关掉Redis客户端返回空字典的json,如果超时前得到了push的数据就返回数据,最后关掉Redis连接。结果在Redis用info得到co...
落地花开啦 2019-12-01 20:03:01 1686 浏览量 回答数 1

问题

Node.js 请求审批实例列表返回404

http发送post请求 query是各种参数 开发文档上面显示 发送两种参数 一种是 公共参数一种是 请求参数 这两种参数我都放在了query里面 请求方式:post https://eco.taobao.com/router/res...
塔姆良兮 2019-12-01 21:00:11 1640 浏览量 回答数 1

回答

开发建议 优先考虑使用SDK进行调用。推荐使用版本:v3. API调用涉及较多公共请求参数和签名机制,使用过程相对复杂。推荐使用版本:v2. 版本说明 版本:v3 发布时间:2020.03 SDK语言支持:Java、Go、Node.js、.NET(PHP、Python计划支持中) API调用:暂不支持,请使用版本:v2 版本:v2 发布时间:2019.04 SDK语言支持:Java、Go、Node.js、.NET、PHP、Python API调用:支持 版本:v1 发布时间:2018.03 SDK语言支持:Java、Node.js、PHP API调用:支持
保持可爱mmm 2020-03-27 10:54:00 0 浏览量 回答数 0

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

回答

用DescribeCategories查询平台类型。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试 请求头 该接口使用公共请求头,无特殊请求头。请参见公共请求参数文档。 请求语法 GET /pop/v1/wam/category HTTPS|HTTP 请求参数 返回数据 名称 类型 示例值 描述 Categories Array 平台类型查询结果 Code String OK 响应代码,若成功请求为OK Message String success 响应消息,若成功请求为success RequestId String 6E99F8E3-7493-4ADA-A27B-2DFF2C693555 请求ID 示例 请求示例 http://webplus.cn-hangzhou.aliyuncs.com/pop/v1/wam/category?ServiceCode=webx&<公共请求参数> 正常返回示例 XML 格式 success 2EF90744-064A-4841-B9E3-6B0D7AE6785A OK Tomcat wca-5c937c98a9c0296d0c4823912 Use Tomcat as an application container, support for WAR or ZIP type application deployment packages. https://github.com/aliyun/alibabacloud-webplus-tomcat-demo cn-shenzhen oss://webplus-prod-cn-shenzhen/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war https://github.com/aliyun/alibabacloud-webplus-tomcat-demo cn-zhangjiakou oss://webplus-prod-cn-zhangjiakou/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war https://github.com/aliyun/alibabacloud-webplus-tomcat-demo cn-beijing oss://webplus-prod-cn-beijing/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war https://github.com/aliyun/alibabacloud-webplus-tomcat-demo cn-shanghai oss://webplus-prod-cn-shanghai/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war https://github.com/aliyun/alibabacloud-webplus-tomcat-demo cn-hangzhou oss://webplus-prod-cn-hangzhou/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war http://tomcat.apache.org/res/images/tomcat.png 1553218065000 1553218065000 Java wca-6c937c98a9c0296d0c4823912 Direct startup using Java commands, support for FatJAR or ZIP type application deployment packages. https://github.com/aliyun/alibabacloud-webplus-java-demo cn-shenzhen oss://webplus-prod-cn-shenzhen/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar https://github.com/aliyun/alibabacloud-webplus-java-demo cn-zhangjiakou oss://webplus-prod-cn-zhangjiakou/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar https://github.com/aliyun/alibabacloud-webplus-java-demo cn-beijing oss://webplus-prod-cn-beijing/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar https://github.com/aliyun/alibabacloud-webplus-java-demo cn-shanghai oss://webplus-prod-cn-shanghai/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar https://github.com/aliyun/alibabacloud-webplus-java-demo cn-hangzhou oss://webplus-prod-cn-hangzhou/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar https://openjdk.java.net/images/duke-thinking.png 1553218065000 1553218065000 Node.js wca-7c937c98a9c0296d0c4823912 The Node.js application supports ZIP-type application deployment packages. https://github.com/aliyun/alibabacloud-webplus-node-demo cn-shenzhen oss://webplus-prod-cn-shenzhen/quickstart/node/first-step/webplus-node-demo-0.1.0.zip https://github.com/aliyun/alibabacloud-webplus-node-demo cn-zhangjiakou oss://webplus-prod-cn-zhangjiakou/quickstart/node/first-step/webplus-node-demo-0.1.0.zip https://github.com/aliyun/alibabacloud-webplus-node-demo cn-beijing oss://webplus-prod-cn-beijing/quickstart/node/first-step/webplus-node-demo-0.1.0.zip https://github.com/aliyun/alibabacloud-webplus-node-demo cn-shanghai oss://webplus-prod-cn-shanghai/quickstart/node/first-step/webplus-node-demo-0.1.0.zip https://github.com/aliyun/alibabacloud-webplus-node-demo cn-hangzhou oss://webplus-prod-cn-hangzhou/quickstart/node/first-step/webplus-node-demo-0.1.0.zip http://tomcat.apache.org/res/images/tomcat.png 1553218065000 1553218065000 JSON 格式 { "Message":"success", "RequestId":"20A72DF0-F63D-4763-BBCA-1999AAA9693D", "Categories":{ "Category":[ { "CategoryId":"wca-5c937c98a9c0296d0c4823912", "DemoProjects":{ "DemoProject":[ { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-tomcat-demo", "PackageUrl":"oss://webplus-prod-cn-shenzhen/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war", "RegionId":"cn-shenzhen" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-tomcat-demo", "PackageUrl":"oss://webplus-prod-cn-zhangjiakou/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war", "RegionId":"cn-zhangjiakou" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-tomcat-demo", "PackageUrl":"oss://webplus-prod-cn-beijing/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war", "RegionId":"cn-beijing" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-tomcat-demo", "PackageUrl":"oss://webplus-prod-cn-shanghai/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war", "RegionId":"cn-shanghai" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-tomcat-demo", "PackageUrl":"oss://webplus-prod-cn-hangzhou/quickstart/tomcat/first-step/webplus-tomcat-demo-0.1.1.war", "RegionId":"cn-hangzhou" } ] }, "CategoryLogo":"http://tomcat.apache.org/res/images/tomcat.png", "CreateTime":1553218065000, "UpdateTime":1553218065000, "CategoryName":"Tomcat", "CategoryDescription":"Use Tomcat as an application container, support for WAR or ZIP type application deployment packages." }, { "CategoryId":"wca-6c937c98a9c0296d0c4823912", "DemoProjects":{ "DemoProject":[ { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-java-demo", "PackageUrl":"oss://webplus-prod-cn-shenzhen/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar", "RegionId":"cn-shenzhen" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-java-demo", "PackageUrl":"oss://webplus-prod-cn-zhangjiakou/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar", "RegionId":"cn-zhangjiakou" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-java-demo", "PackageUrl":"oss://webplus-prod-cn-beijing/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar", "RegionId":"cn-beijing" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-java-demo", "PackageUrl":"oss://webplus-prod-cn-shanghai/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar", "RegionId":"cn-shanghai" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-java-demo", "PackageUrl":"oss://webplus-prod-cn-hangzhou/quickstart/java/first-step/webplus-java-demo-0.1.1-exec.jar", "RegionId":"cn-hangzhou" } ] }, "CategoryLogo":"https://openjdk.java.net/images/duke-thinking.png", "CreateTime":1553218065000, "UpdateTime":1553218065000, "CategoryName":"Java", "CategoryDescription":"Direct startup using Java commands, support for FatJAR or ZIP type application deployment packages." }, { "CategoryId":"wca-7c937c98a9c0296d0c4823912", "DemoProjects":{ "DemoProject":[ { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-node-demo", "PackageUrl":"oss://webplus-prod-cn-shenzhen/quickstart/node/first-step/webplus-node-demo-0.1.0.zip", "RegionId":"cn-shenzhen" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-node-demo", "PackageUrl":"oss://webplus-prod-cn-zhangjiakou/quickstart/node/first-step/webplus-node-demo-0.1.0.zip", "RegionId":"cn-zhangjiakou" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-node-demo", "PackageUrl":"oss://webplus-prod-cn-beijing/quickstart/node/first-step/webplus-node-demo-0.1.0.zip", "RegionId":"cn-beijing" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-node-demo", "PackageUrl":"oss://webplus-prod-cn-shanghai/quickstart/node/first-step/webplus-node-demo-0.1.0.zip", "RegionId":"cn-shanghai" }, { "SourceUrl":"https://github.com/aliyun/alibabacloud-webplus-node-demo", "PackageUrl":"oss://webplus-prod-cn-hangzhou/quickstart/node/first-step/webplus-node-demo-0.1.0.zip", "RegionId":"cn-hangzhou" } ] }, "CategoryLogo":"http://tomcat.apache.org/res/images/tomcat.png", "CreateTime":1553218065000, "UpdateTime":1553218065000, "CategoryName":"Node.js", "CategoryDescription":"The Node.js application supports ZIP-type application deployment packages." } ] }, "Code":"OK" } 错误码 访问错误中心查看更多错误码。 调用DescribeStacks查询技术栈。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试 请求头 该接口使用公共请求头,无特殊请求头。请参见公共请求参数文档。 请求语法 GET /pop/v1/wam/stack HTTP/1.1 请求参数 名称 类型 是否必选 示例值 描述 CategoryName String 否 Java 技术栈类型名称 PageNumber Integer 否 1 查询页面数 PageSize Integer 否 10 查询页面大小 RecommendedOnly Boolean 否 true 仅查询推荐的技术栈 返回数据 名称 类型 示例值 描述 PageNumber Integer 1 查询页面数量 Message String success 响应消息,若成功请求为success Code String OK 响应代码,若成功请求为OK PageSize Integer 10 查询页面大小 RequestId String E95B3D91-ED61-4715-AAD1-7E496A*****6 请求ID Stacks 技术栈查询结果列表 TotalCount Integer 1 查询结果总数 示例 请求示例 http://webplus.cn-hangzhou.aliyuncs.com/pop/v1/wam/stack?ServiceCode=webx&Category=Java&PageSize=10&PageNumber=1&RecommendedOnly=true&<公共请求参数> 正常返回示例 XML 格式 1 1 success 10 2581EA69-00C2-44F8-85DD-1F1 44D7 true Java true ws-6c937c98a9c 0c4823984 1553218065000 10 1553218065000 Java 8 / Aliyun Linux 2.1903 OK JSON 格式 { "PageNumber":1, "TotalCount":1, "Message":"success", "PageSize":10, "RequestId":"1EC2BF9F-20BA-4877-B9DC-89CA*****589", "Stacks":{ "Stack":[ { "LatestStack":true, "CategoryName":"Java", "RecommendedStack":true, "StackId":"ws-6c937c98a9*****d0c4823984", "CreateTime":1553218065000, "VersionCode":10, "UpdateTime":1553218065000, "StackName":"Java 8 / Aliyun Linux 2.1903" } ] }, "Code":"OK"
1934890530796658 2020-03-23 14:59:25 0 浏览量 回答数 0

问题

Node如何连接SQLServer和Oracle数据库? 400 请求报错 

如题所述,各位大虾能不能给个例子. 手头上只有SQLServer2008 和Oracle 10. 尝试使用了一个叫做mssql.js的插件. 提示传递的Server参数出错,不知道是否那里设置错误....
kun坤 2020-05-30 22:58:26 0 浏览量 回答数 1

问题

【精品问答】前端开发必懂之JS技术二百问

1.document load 和 document ready 的区别 2.JavaScript 中如何检测一个变量是一个 String 类型? 3.请用 js 去除字符串空格? 4.js 是一门怎样的语言&#...
茶什i 2019-12-01 22:05:04 146 浏览量 回答数 0

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动:或许你挑灯夜战只为一道难题或许你百思不解只求一个答案或许你绞尽脑汁只因一种未知那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了他们用户自己手中的技术来帮助用户成长本次活动特邀百位阿里技术专家对javascript常...
管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

问题

使用Node.js存储文件到OSS报ECONNRESET错误

Node.js通过Express做的网站,允许用户上传文件,服务端将文件保存到OSS里面。 Node.js的OSS SDK用的是论坛帖子里面推荐的node-oss。 由于要处理大文件以及之后准备断点续传&...
老羊肖恩 2019-12-01 21:27:43 15135 浏览量 回答数 5

回答

号码百科产品接口支持HTTP调用、SDK调用和OpenAPI Explorer调用。 HTTP调用 号码百科的API是RPC风格,您可以通过发送HTTP GET请求调用号码百科产品的API。 其请求结构如下: http://Endpoint/?Action=xx&Parameters 其中: Endpoint: 号码百科API的服务接入地址为dytnsapi.aliyuncs.com。 Action:要执行的操作,如调用QueryPhoneNumberAttribute查询已创建的负载均衡实例。 Version:要使用的API版本,号码百科的API版本是2020-02-17。 Parameters:请求参数,每个参数之间用“&”分隔。 请求参数由公共请求参数和API自定义参数组成。公共参数中包含API版本号、身份验证等信息,详情请参见 公共参数。 下面是一个调用QueryPhoneNumberAttribute接口查询号码归属地信息的示例: 说明 为了便于用户查看,本文档中的示例都做了格式化处理。 https://dytnsapi.aliyuncs.com/?Action=QueryPhoneNumberAttribute &Format=xml &Version=2020-02-17 &Signature=xxxx%xxxx%3D &SignatureMethod=HMAC-SHA1 &SignatureNonce=15215528852396 &SignatureVersion=1.0 &AccessKeyId=key-test &TimeStamp=2020-02-17T12:00:00Z … SDK调用 阿里云号码百科 提供Java、Python、Go、.NET、Node.js、PHP语言的SDK。阿里云SDK免去您手动签名的过程,方便使用。 OpenAPI Explorer调用 OpenAPI Explorer可视化的 API 调用工具。通过该工具,您可以通过网页或者命令行调用各云产品以及 API 市场上开放的API,查看每次的API请求和返回结果,并生成相应SDK调用示例。 您可以直接访问https://api.aliyun.com/调用API也可以通过API文档中的调试功能进行调用。
保持可爱mmm 2020-03-26 23:59:52 0 浏览量 回答数 0

回答

跨域是个⽐较古⽼的命题了,历史上跨域的实现⼿段有很多,我们现在主要介绍三种⽐较主流的跨域⽅案,其余的⽅案我们就不深⼊讨论了,因为使⽤场景很少,也没必要记这么多奇技淫巧。 最经典的跨域⽅案jsonp jsonp本质上是⼀个Hack,它利⽤ <script>标签不受同源策略限制的特性进⾏跨域操作。 jsonp优点: 实现简单 兼容性⾮常好 jsonp的缺点: 只⽀持get请求(因为 <script> 标签只能get) 有安全性问题,容易遭受xss攻击需要服务端配合jsonp进⾏⼀定程度的改造 jsonp的实现: function JSONP({ url, params, callbackKey, callback }) { // 在参数⾥制定 callback 的名字 params = params || {} params[callbackKey] = 'jsonpCallback' // 预留 callback window.jsonpCallback = callback // 拼接参数字符串 const paramKeys = Object.keys(params) const paramString = paramKeys .map(key => `${key}=${params[key]}`) .join('&') // 插⼊ DOM 元素 const script = document.createElement('script') script.setAttribute('src', `${url}?${paramString}`) document.body.appendChild(script) } JSONP({ url: 'http://s.weibo.com/ajax/jsonp/suggestion', params: { key: 'test', }, callbackKey: '_cb', callback(result) { console.log(result.data) } }) 最流⾏的跨域⽅案cors cors是⽬前主流的跨域解决⽅案,跨域资源共享(CORS) 是⼀种机制,它使⽤额外的 HTTP 头来告诉浏览器 让运⾏在⼀个 origin (domain) 上的Web应⽤被准许访问来⾃不同源服务器上的指定的资源。当⼀个资源从与该资源本身所在的服务器不同的域、协议或端⼝请求⼀个资源时,资源会发起⼀个跨域 HTTP 请求。 如果你⽤express,可以这样在后端设置 //CORS middleware var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', 'http://example.com'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); } //... app.configure(function() { app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session({ secret: 'cool beans' })); app.use(express.methodOverride()); app.use(allowCrossDomain); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 在⽣产环境中建议⽤成熟的开源中间件解决问题。 简单请求 以 Ajax 为例,当满足以下条件时,会触发简单请求 使用下列方法之一: GET HEAD POST Content-Type 的值仅限于下列三者之一: text/plain multipart/form-data application/x-www-form-urlencoded 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器; XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。 复杂请求 那么很显然,不符合以上条件的请求就肯定是复杂请求了。 对于复杂请求来说,首先会发起一个预检请求,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。 对于预检请求来说,如果你使用过 Node 来设置 CORS 的话,可能会遇到过这么一个坑。 以下以 express 框架举例: app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*') res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS') res.header( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Credentials' ) next() }) 该请求会验证你的 Authorization 字段,没有的话就会报错。 当前端发起了复杂请求后,你会发现就算你代码是正确的,返回结果也永远是报错的。因为预检请求也会进入回调中,也会触发 next 方法,因为预检请求并不包含 Authorization 字段,所以服务端会报错。 想解决这个问题很简单,只需要在回调中过滤 option 方法即可 res.statusCode = 204 res.setHeader('Content-Length', '0') res.end() 最⽅便的跨域⽅案Nginx nginx是⼀款极其强⼤的web服务器,其优点就是轻量级、启动快、⾼并发。 现在的新项⽬中nginx⼏乎是⾸选,我们⽤node或者java开发的服务通常都需要经过nginx的反向代理。 反向代理的原理很简单,即所有客户端的请求都必须先经过nginx的处理,nginx作为代理服务器再讲请求转发给node或者java服务,这样就规避了同源策略。 其它跨域⽅案 HTML5 XMLHttpRequest 有⼀个API,postMessage()⽅法允许来⾃不同源的脚本采⽤异步⽅式进⾏有限的通信, 可以实现跨⽂本档、多窗⼝、跨域消息传递。WebSocket 是⼀种双向通信协议,在建⽴连接之后,WebSocket 的 server 与 client 都能主动向对⽅发送或接收数 据,连接建⽴好了之后 client 与 server 之间的双向通信就与 HTTP ⽆关了,因此可以跨域。window.name + iframe:window.name属性值在不同的⻚⾯(甚⾄不同域名)加载后依旧存在,并且可以⽀持⾮常 ⻓的 name 值,我们可以利⽤这个特点进⾏跨域。location.hash + iframe:a.html欲与c.html跨域相互通信,通过中间⻚b.html来实现。 三个⻚⾯,不同域之间利⽤ iframe的location.hash传值,相同域之间直接js访问来通信。document.domain + iframe: 该⽅式只能⽤于⼆级域名相同的情况下,⽐如 a.test.com 和 b.test.com 适⽤于该⽅ 式,我们只需要给⻚⾯添加 document.domain ='test.com' 表示⼆级域名都相同就可以实现跨域,两个⻚⾯都通过js 强制设置document.domain为基础主域,就实现了同域。
前端问答 2019-12-23 12:52:12 0 浏览量 回答数 0

回答

概述 对于每一次 HTTP 或者 HTTPS 协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用 AccessKeyID 和 AccessKeySecret 对称加密验证实现。 AccessKeyID 和 AccessKeySecret 可在控制台 AccessKey 管理 页面获得。其中 AccessKeyID 是访问者身份,AccessKeySecret 是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。 说明:我们提供了多种编程语言的 SDK 及第三方 SDK,可以免去您签名的烦恼。更多详情,请下载 SDK。 步骤 1. 构造规范化请求字符串 排序参数。排序规则以首字母顺序排序,排序参数包括 公共请求参数 和接口自定义参数,不包括公共请求参数中的 Signature 参数。 说明:当使用 GET 方法提交请求时,这些参数就是请求 URL 中的参数部分。即 URL 中 ? 之后由 & 连接的部分。 编码参数。使用 UTF-8 字符集按照 RFC3986 规则编码请求参数和参数取值,编码规则如下: 字符 A~Z、a~z、0~9 以及字符 -、_、.、~ 不编码。 其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制。示例:半角双引号(")对应 %22。 扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式。 空格( )编码成 %20,而不是加号(+)。 该编码方式与 application/x-www-form-urlencoded MIME 格式编码算法相似,但又有所不同。 如果您使用的是 Java 标准库中的 java.net.URLEncoder,可以先用标准库中 percentEncode 编码,随后将编码后的字符中加号(+)替换为 %20、星号(*)替换为 %2A、%7E 替换为波浪号(~),即可得到上述规则描述的编码字符串。 使用等号(=)连接编码后的请求参数和参数取值。 使用与号(&)连接编码后的请求参数,注意参数排序与 步骤 1 一致。 步骤 2. 构造签名字符串 构造待签名字符串 StringToSign。 您可以同样使用 percentEncode 处理上一步构造的规范化请求字符串,规则如下: StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。 计算 HMAC 值。 按照 RFC2104 的定义,使用上述步骤得到的字符串计算签名 HMAC 值。 注意:计算签名时使用的 Key 就是您持有的 AccessKeySecret 并加上一个 & 字符(ASCII:38),使用的哈希算法是 SHA1。 计算签名值。 按照 Base64 编码规则 把上一步骤中的 HMAC 值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为 Signature 参数添加到请求参数中,即完成请求签名过程。 注意:得到的签名值在作为最后的请求参数值提交给服务器时,也要按照 RFC3986 规则进行 URL 编码。 请求示例 以 GetVideoPlayAuth 为例,假设使用的 AccessKeyId 为 testAccessKeyId, AccessKeySecret 为 testAccessKeySecret。 那么签名前的请求 URL 为: http://vod.cn-shanghai.aliyuncs.com/?TimeStamp=2017-10-10T12:02:54Z&Format=JSON&AccessKeyId=testAccessKeyId&Action=GetVideoPlayAuth&SignatureMethod=HMAC-SHA1&SignatureNonce=8f8a035d-6496-4268-afd4-67c22837e38d&Version=2017-03-21&SignatureVersion=1.0&VideoId=5aed81b74ba84920be578cdfe004af4b 计算得到的待签名字符串 StringToSign 为: GET&%2F&AccessKeyId%3DtestAccessKeyId&Action%3DGetVideoPlayAuth&Format%3DJSON&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D8f8a035d-6496-4268-afd4-67c22837e38d&SignatureVersion%3D1.0&Timestamp%3D2017-10-10T12%253A02%253A54Z&Version%3D2017-03-21&VideoId%3D5aed81b74ba84920be578cdfe004af4b 因为 AccessKeySecret 为 testAccessKeySecret,所以用于计算 HMAC 的 Key 为 testAccessKeySecret&,计算得到的签名值为: Ibgh7y8Vp47LBuAsf5Xhi1SvDss%3D 将签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 为: http://vod.cn-shanghai.aliyuncs.com?AccessKeyId=testAccessKeyId&Action=GetVideoPlayAuth&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=8f8a035d-6496-4268-afd4-67c22837e38d&SignatureVersion=1.0&Timestamp=2017-10-10T12%3A02%3A54Z&Version=2017-03-21&VideoId=5aed81b74ba84920be578cdfe004af4b&Signature=Ibgh7y8Vp47LBuAsf5Xhi1SvDss%3D Java 示例代码 以下将为您介绍OpenAPI公共参数中需要您通过代码生成的参数,其他参数请根据文档填写具体值(本示例不需要依赖第三方的库包,可以直接使用)。 1. 生成签名串Signature 构造签名字符串分为以下几个步骤进行: 1.1. 构造规范化的请求字符串 参数排序及URL编码。其中,参数排序是指将参数名称以字母序升序排列。 /*对所有参数名称和参数值做URL编码*/ public static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) { List<String> encodeParams = new ArrayList<String>(); if (publicParams != null) { for (String key : publicParams.keySet()) { String value = publicParams.get(key); //将参数和值都urlEncode一下。 String encodeKey = percentEncode(key); String encodeVal = percentEncode(value); encodeParams.add(encodeKey + "=" + encodeVal); } } if (privateParams != null) { for (String key : privateParams.keySet()) { String value = privateParams.get(key); //将参数和值都urlEncode一下。 String encodeKey = percentEncode(key); String encodeVal = percentEncode(value); encodeParams.add(encodeKey + "=" + encodeVal); } } return encodeParams; } /*获取 CanonicalizedQueryString*/ public static String getCQS(List<String> allParams) { ParamsComparator paramsComparator = new ParamsComparator(); Collections.sort(allParams, paramsComparator); String cqString = ""; for (int i = 0; i < allParams.size(); i++) { cqString += allParams.get(i); if (i != allParams.size() - 1) { cqString += "&"; } } return cqString; } /*字符串参数比较器,按字母序升序*/ public static class ParamsComparator implements Comparator<String> { @Override public int compare(String lhs, String rhs) { return lhs.compareTo(rhs); } } 1.2. 构造待签名的字符串 /*构造待签名的字符串*/ String StringToSign = httpMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString); /*特殊字符替换为转义字符*/ public static String percentEncode(String value) { try { String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8"); String plusReplaced = urlEncodeOrignStr.replace("+", "%20"); String starReplaced = plusReplaced.replace("*", "%2A"); String waveReplaced = starReplaced.replace("%7E", "~"); return waveReplaced; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return value; } 1.3. 计算待签名字符串的HMAC值 public static byte[] hmacSHA1Signature(String accessKeySecret, String stringToSign) { try { String key = accessKeySecret + "&"; try { SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signKey); return mac.doFinal(stringToSign.getBytes()); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } } catch (SignatureException e) { e.printStackTrace(); } return null; } 1.4. 编码得到最终签名值 按照 Base64 编码规则将1.3中计算得到的HMAC值编码成字符串,得到最终签名值(Signature)。 public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(new BASE64Encoder().encode(bytes)); } 生成时间戳TimeStamp 生成TimeStamp,为UTC时间戳,如:2017-10-10T12:02:54Z /*生成当前UTC时间戳Time*/ public static String generateTimestamp() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(new SimpleTimeZone(0, "GMT")); return df.format(date); } 生成随机数SignatureNonce public static String generateRandom() { String signatureNonce = UUID.randomUUID().toString(); return signatureNonce; } 至此,已经为您重点介绍了如何生成OpenAPI核心参数的代码示例,为了方便您快速使用签名机制,您可以在 OpenAPI调用示例 下载完整的OpenAPI调用示例Java代码。 更多参考 服务端SDK 可以直接使用服务端接口SDK,来避免自行实现签名机制,SDK支持以下语言版本: Java SDK Python SDK PHP SDK .NET SDK Node.js SDK Go SDK C/C++ SDK 服务端接口SDK封装了 点播服务API 的使用,也提供了各接口的代码示例。 其它签名示例 如确实想自行计算签名,可参考阿里云SDK的签名实现代码: PHP 签名示例 Python签名示例 .NET 签名示例 Go 签名示例 Node.js 签名示例 C/C++ 签名示例
保持可爱mmm 2020-03-30 12:07:33 0 浏览量 回答数 0

回答

云函数(FaaS)是一段运行在云端的、轻量的、无关联的、并且可重用的代码。无需管理服务器,只需编写和上传代码,即可获得对应的数据结果。使用云函数可以使企业和开发者不需要担心服务器或底层运维设施,可以更专注代码和业务本身,也可以使代码进一步解耦,增加其重用性。 在客户端只需依赖mpserverless-sdk,在应用的上下文中进行简单的鉴权配置,即可调用云函数。 云函数的入参只有一个ctx对象,该对象可获取调用的云函数时传入的参数,也可获取小程序serverless服务空间的云数据库,云存储等服务。 例如,我们定义一个云函数,名为hello。代码如下所示: //云函数定义在index.js中,此文件为云函数的入口文件 module.exports = ctx => { const args = ctx.args; return { "text": args.hello, }; };云函数支持使用Node.js进行开发。您可将代码提交到云端运行,在客户端使用小程序Serverless提供的API进行调用。您还可以在云函数中直接通过API调用数据存储和文件存储的服务资源。 说明 目前云函数内不能调用其他云函数,只支持客户端的使用场景,例如支付宝小程序。 步骤一 定义云函数 关联上对应的后端云服务后,您可以在服务端目录中编写云函数的代码。 登录小程序云控制台,创建云函数。 详细操作,请参见新建云函数。 注意 云函数的名称必须和要上传的Node.js代码包名称一致。 新建云函数 在小程序的server/functions目录下创建云函数目录。 其中index.js是云函数getImageList的入口文件。 └── server/ └── functions └── getImageList └── index.js 编写云函数代码。 以下代码示例展示了如何从数据库images里面查出特定用户上传的图片记录。 module.exports = async (ctx) => { const images = await ctx.mpserverless.db.collection('images').find({ owner: ctx.args.username }); return { images }; }; 说明 云函数的返回值类型仅支持JSON格式。 打包云函数文件。 确保云函数文件名称和控制台上创建的云函数名称一致且为ZIP格式。 步骤二 部署云函数 编写云函数代码后,您需要将云函数代码上传至控制台发布代码。 在左侧导航栏,选择小程序Serverless > 云函数。 单击已创建的函数名称链接。 在发布管理页签,单击上传js包或更新js包,然后选择要上传的代码包。 说明 上传的代码包必须满足以下要求: 代码包的名称必须和在控制台上创建的函数名称一致。 代码包必须是.zip文件。 上传的代码包必须包含index.js文件。 上传成功后,单击代码部署。 步骤三 调用云函数 云函数代码发布后,在客户端您可以使用mpserverless.function.invoke方法调用上述定义的云函数。 以下代码示例展示了如何获取用户上传的图片记录,然后更新页面数据。 // 引入MPServerless模块 const MPServerless = require('@alicloud/mpserverless-sdk'); // 初始化MPServerless对象 const mpServerless = new MPServerless({ uploadFile: my.uploadFile, request: my.request, getAuthCode: my.getAuthCode, }, { appId: '1234456789', // 小程序应用标识 spaceId: 'db4dd657-7041-470a-90xxxxx', // 服务空间标识 clientSecret: '6c3c86xxxx6', // 服务空间 secret key endpoint: 'https://api.bspapp.com', // 服务空间地址,从小程序 serverless 控制台处获得 }); // 调用云函数getImageList mpServerless.function.invoke('getImageList', { username: 'Vincent', }).then((res) => { if (res.success && res.result) { this.setData({ imageList: res.result.images }); } }).catch(console.error); 云函数是一个后端服务,有时需要获得从客户端传来的参数。通过云函数内置的ctx.args方法,您可以获得从客户端传来的参数。 客户端代码 以下是客户端代码示例: await mpserverless.function.invoke('hello', { hello: 'world' }); 云函数代码 以下是云函数代码示例: module.exports = async ctx => { ctx.logger.info('hello %s', ctx.args.hello); }; 在云函数中,您可以直接调用同一环境(空间)的数据存储和文件存储服务。ctx.mpserverless在云函数封装了小程序的基础服务, API使用方式和客户端一致。 例如,要从数据存储获取数据,可以直接调用ctx.mpserverless.db方法: module.exports = async ctx => { const args = ctx.args; return await ctx.mpserverless.db.collection('user').find({ uid: args.uid }); }; 云函数(FaaS)是一段运行在云端的、轻量的、无关联的、并且可重用的代码。无需管理服务器,只需编写和上传代码,即可获得对应的数据结果。使用云函数可以使企业和开发者不需要担心服务器或底层运维设施,可以更专注代码和业务本身,也可以使代码进一步解耦,增加其重用性。 在客户端只需依赖mpserverless-sdk,在应用的上下文中进行简单的鉴权配置,即可调用云函数。 云函数的入参只有一个ctx对象,该对象可获取调用的云函数时传入的参数,也可获取小程序serverless服务空间的云数据库,云存储等服务。 云函数提供了 ctx.httpclient HTTP 请求方法。无需额外依赖,您就可以请求任何 HTTP 和 HTTPS 协议的 Web 服务。 例如,请求一个网页: module.exports = async ctx => { const res = await ctx.httpclient.request('https://www.alipay.com/x/notFound.htm'); return { html: res.status === 200 ? res.data : '', }; }; 其中,ctx.httpclient返回的是一个urllib实例。 云函数(FaaS)是一段运行在云端的、轻量的、无关联的、并且可重用的代码。无需管理服务器,只需编写和上传代码,即可获得对应的数据结果。使用云函数可以使企业和开发者不需要担心服务器或底层运维设施,可以更专注代码和业务本身,也可以使代码进一步解耦,增加其重用性。 在客户端只需依赖mpserverless-sdk,在应用的上下文中进行简单的鉴权配置,即可调用云函数。 云函数的入参只有一个ctx对象,该对象可获取调用的云函数时传入的参数,也可获取小程序serverless服务空间的云数据库,云存储等服务。
南霸天霸南北 2020-02-17 16:48:28 0 浏览量 回答数 0

回答

参数:app_auth_token。 类型:String(40)。 是否必填:否。 使用场景:商户对开发者进行应用授权后,开发者可以帮助商户完成相应的业务逻辑,例如服务商代替商户发起当面付的收单请求。 不同开发语言设置app_auth_token的方式不同,具体请查看对应示例。 1、Java开发语言 //(1)execute(如当面付接口): response = alipayClient.execute(request,null,"app_auth_token参数值"); request.putOtherTextParam("app_auth_token", "app_auth_token参数值"); //(2)pageExecute(如电脑网站支付、手机网站支付): request.putOtherTextParam("app_auth_token", "app_auth_token参数值"); //(3)sdkexecute(如app支付): request.putOtherTextParam("app_auth_token", "app_auth_token参数值"); 2、PHP开发语言 //(1)execute(如当面付接口): $result = $aop->execute ($request,null,$app_auth_token); //(2)pageExecute(如电脑网站支付、手机网站支付): $result = $aop->pageExecute($request,null,$app_auth_token); //(3)sdkexecute(如app支付): $result = $aop->sdkExecute($request,$app_auth_token); 3、.net开发语言 //(1)execute(如当面付接口): response=client.Execute(request, null, appAuthToken); //(2)pageExecute(如电脑网站支付、手机网站支付): response=client.pageExecute(request,null,appAuthToken,string reqMethod); //ps:string reqMethod可填写成post或者GET(大写)对应着生成的请求字符串是以form表单格式输出还是请求字符串数据输出。不设置该参数,为空默认传递post,生成的是以form表单的格式数据输出 //(3)sdkExecute(如app支付): response =client.sdkExecute(request,appAuthToken); 4、python开发语言 在udf_params参数内传递auth_token、app_auth_token等其他公共参数,需要引入from alipay.aop.api.constant.ParamConstants import * 方法 udf_params = dict() #传递app_auth_token方法 udf_params[P_APP_AUTH_TOKEN] = "app_auth_token参数值" #传递auth_token方法 udf_params[P_AUTH_TOKEN] = "auth_token参数值" request.udf_params = udf_params 5、node.js开发语言 //(1)使用formData方式传递生成请求参数(如电脑网站支付、手机网站支付、app支付) formData.addField('app_auth_token', 'app_auth_token参数值'); //(2)不使用formData方式传递,直接提交获取响应数据(如当面付接口) const result =alipaySdk.exec('alipay.trade.precreate',{ //传递app_auth_token方法 appAuthToken:"app_auth_token参数值", bizContent: {}, }
保持可爱mmm 2020-05-07 15:48:22 0 浏览量 回答数 0

回答

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Node 可能是某些人的正确选择。 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务。 Node 旨在解决什么问题? Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户端基础的增长,您希望您的 web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在 Java 中,静态变量和缓存需要在每个服务器上的 JVMs 之间共享。这就是整个 web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。 Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的 OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。 现在您有了一个能处理数万条并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 如何工作以及它被设计的如何运行。 Node 肯定不是什么 没错,Node 是一个服务器程序。但是,它肯定不 像 Apache 或 Tomcat。那些服务器是独立服务器产品,可以立即安装并部署应用程序。通过这些产品,您可以在一分钟内启动并运行一个服务器。Node 肯定不是这种产品。Apache 能添加一个 PHP 模块来允许开发人员创建动态 web 页,使用 Tomcat 的程序员能部署 JSPs 来创建动态 web 页。Node 肯定不是这种类型。 在 Node 的早期阶段(当前是 version 0.4.6),它还不是一个 “运行就绪” 的服务器程序,您还不能安装它,向其中放置文件,拥有一个功能齐全的 web 服务器。即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?没错,您没有看错。服务器端 JavaScript 是一个相对较新的概念,这个概念是大约两年前在 developerWorks 上讨论 Aptana Jaxer 产品时提到的(参见 参考资料)。尽管 Jaxer 一直没有真正流行,但这个理念本身并不是遥不可及的 — 为何不能在服务器上使用客户机上使用的编程语言? 什么使 V8?V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。它不仅限于在一个浏览器中运行。因此,Node 实际上使用 Google 编写的 V8 JavaScript 引擎并将其重建为在服务器上使用。太完美了!既然已经有一个不错的解决方案可用,为何还要创建一种新语言呢? 事件驱动编程 许多程序员接受的教育使他们认为,面向对象编程是完美的编程设计,而对其他编程方法不屑一顾。Node 使用一个所谓的事件驱动编程模型。 清单 1. 客户端上使用 jQuery 的事件驱动编程 复制代码 代码如下: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); 实际上,服务器端和客户端没有任何区别。没错,这没有按钮点击操作,也没有向文本字段键入的操作,但在一个更高的层面上,事件正在 发生。一个连接被建立 — 事件!数据通过连接接收 — 事件!数据通过连接停止 — 事件! 为什么这种设置类型对 Node 很理想?JavaScript 是一种很棒的事件驱动编程语言,因为它允许匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处编写。这样,代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有在上面架构任何内容的潜能。只需监听事件,编写一个回调函数,然后,事件驱动编程将照管好一切! 示例 Node 应用程序 最后,我们来看一些代码!让我们将讨论过的所有内容综合起来,创建我们的第一个 Node 应用程序。由于我们已经知道,Node 对于处理高流量应用程序很理想,我们就来创建一个非常简单的 web 应用程序 — 一个为实现最大速度而构建的应用程序。下面是 “老板” 交代的关于我们的样例应用程序的具体要求:创建一个随机数字生成器 RESTful API。这个应用程序应该接受一个输入:一个名为 “number” 的参数。然后,应用程序返回一个介于 0 和该参数之间的随机数字,并将生成的数字返回调用者。由于 “老板” 希望它成为一个广泛流行的应用程序,因此它应该能处理 50,000 个并发用户。我们来看看代码: 清单 2. Node 随机数字生成器 复制代码 代码如下: // these modules need to be imported in order to use them. // Node has several modules. They are like any #include // or import statement in other languages var http = require("http"); var url = require("url"); // The most important line in any Node file. This function // does the actual process of creating the server. Technically, // Node tells the underlying operating system that whenever a // connection is made, this particular callback function should be // executed. Since we're creating a web service with REST API, // we want an HTTP server, which requires the http variable // we created in the lines above. // Finally, you can see that the callback method receives a 'request' // and 'response' object automatically. This should be familiar // to any PHP or Java programmer. http.createServer(function(request, response) { // The response needs to handle all the headers, and the return codes // These types of things are handled automatically in server programs // like Apache and Tomcat, but Node requires everything to be done yourself response.writeHead(200, {"Content-Type": "text/plain"}); // Here is some unique-looking code. This is how Node retrives // parameters passed in from client requests. The url module // handles all these functions. The parse function // deconstructs the URL, and places the query key-values in the // query object. We can find the value for the "number" key // by referencing it directly - the beauty of JavaScript. var params = url.parse(request.url, true).query; var input = params.number; // These are the generic JavaScript methods that will create // our random number that gets passed back to the caller var numInput = new Number(input); var numOutput = new Number(Math.random() * numInput).toFixed(0); // Write the random number to response response.write(numOutput); // Node requires us to explicitly end this connection. This is because // Node allows you to keep a connection open and pass data back and forth, // though that advanced topic isn't discussed in this article. response.end(); // When we create the server, we have to explicitly connect the HTTP server to // a port. Standard HTTP port is 80, so we'll connect it to that one. }).listen(80); // Output a String to the console once the server starts up, letting us know everything // starts up correctly console.log("Random Number Generator Running..."); 将上面的代码放到一个名为 “random.js” 的文件中。现在,要启动这个应用程序并运行它(进而创建 HTTP 服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时它看起来的样子: 复制代码 代码如下: root@ubuntu:/home/moila/ws/mike# node random.js Random Number Generator Running... 访问应用程序 应用程序已经启动并运行。Node 正在监听任何连接,我们来测试一下。由于我们创建了一个简单的 RESTful API,我们可以使用我们的 web 浏览器来访问这个应用程序。键入以下地址(确保您完成了上面的步骤):localhost/?number=27。 您的浏览器窗口将更改到一个介于 0 到 27 之间的随机数字。单击浏览器上的 “重新载入” 按钮,将得到另一个随机数字。就是这样,这就是您的第一个 Node 应用程序! Node 对什么有好处? 到此为止,应该能够回答 “Node 是什么” 这个问题了,但您可能还不清楚什么时候应该使用它。这是一个需要提出的重要问题,因为 Node 对有一些东西有好处,但相反,对另一些东西而言,目前 Node 可能不是一个好的解决方案。您需要小心决定何时使用 Node,因为在错误的情况下使用它可能会导致一个多余编码的 LOT。 它对什么有好处? 正如您此前所看到的,Node 非常适合以下情况:您预计可能有很高的流量,而在响应客户端之前服务器端逻辑和处理所需不一定是巨大的。Node 表现出众的典型示例包括: 1.RESTful API 提供 RESTful API 的 web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它还不需要大量逻辑;它只是从一个数据库查找一些值并组合一个响应。由于响应是少量文本,入站请求时少量文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。 2.Twitter 队列 想像一下像 Twitter 这样的公司,它必须接收 tweets 并将其写入一个数据库。实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站 tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集 tweet 并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个 tweet 将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理 2000 条入站 tweets。每秒 100 万条 tweets 需要 500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能捕获尽可能多的 tweets。一个能处理 50,000 条 tweets 的 Node 机器只需要 20 个服务器。 3.映像文件服务器 一个拥有大型分布式网站的公司(比如 Facebook 或 Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个 404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和 .css 文件等静态文件所需的服务器数量。 它对什么有坏处? 当然,在某些情况下,Node 并非理想选择。下面是 Node 不擅长的领域: 1.动态创建的页 目前,Node 没有提供一种默认方法来创建动态页。例如,使用 JavaServer Pages (JSP) 技术时,可以创建一个在这样的 JSP 代码段中包含循环的 index.jsp 页。Node 不支持这类动态的、HTML 驱动的页面。同样,Node 不太适合作为 Apache 和 Tomcat 这样的网页服务器。因此,如果您想在 Node 中提供这样一个服务器端解决方案,必须自己编写整个解决方案。PHP 程序员不想在每次部署 web 应用程序时都编写一个针对 Apache 的 PHP 转换器,当目前为止,这正是 Node 要求您做的。 2. 关系数据库重型应用程序 Node 的目的是快速、异步和非阻塞。数据库并不一定分享这些目标。它们是同步和阻塞的,因为读写时对数据库的调用在结果生成之前将一直阻塞通道。因此,一个每个请求都需要大量数据库调用、大量读取、大量写入的 web 应用程序非常不适合 Node,这是因为关系数据库本身就能抵销 Node 的众多优势。(新的 NoSQL 数据库更适合 Node,不过那完全是另一个主题了。) 结束语 问题是 “什么是 Node.js?” 应该已经得到解答。阅读本文之后,您应该能通过几个清晰简洁的句子回答这个问题。如果这样,那么您已经走到了许多编码员和程序员的前面。我和许多人都谈论过 Node,但它们对 Node 究竟是什么一直很迷惑。可以理解,他们具有的是 Apache 的思维方式 — 服务器是一个应用程序,将 HTML 文件放入其中,一切就会正常运转。而 Node 是目的驱动的。它是一个软件程序,使用 JavaScript 来允许程序员轻松快速地创建快速、可伸缩的 web 服务器。Apache 是运行就绪的,而 Node 是编码就绪的。 Node 完成了它提供高度可伸缩服务器的目标。它并不分配一个 “每个连接一个线程” 模型,而是使用一个 “每个连接一个流程” 模型,只创建每个连接需要的内存。它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了 Node 的理想目标 — 编写一个高度可伸缩的解决方案变得比较容易。 与理解 Node 是 什么同样重要的是,理解它不是 什么。Node 并不是 Apache 的一个替代品,后者旨在使 PHP web 应用程序更容易伸缩。事实确实如此。在 Node 的这个初始阶段,大量程序员使用它的可能性不大,但在它能发挥作用的场景中,它的表现非常好。 将来应该期望从 Node 得到什么呢?这也许是本文引出的最重要的问题。既然您知道了它现在的作用,您应该会想知道它下一步将做什么。在接下来的一年中,我期待着 Node 提供与现有的第三方支持库更好地集成。现在,许多第三方程序员已经研发了用于 Node 的插件,包括添加文件服务器支持和 MySQL 支持。希望 Node 开始将它们集成到其核心功能中。最后,我还希望 Node 支持某种动态页面模块,这样,您就可以在 HTML 文件中执行在 PHP 和 JSP(也许是一个 NSP,一个 Node 服务器页)中所做的操作。最后,希望有一天会出现一个 “部署就绪” 的 Node 服务器,可以下载和安装,只需将您的 HTML 文件放到其中,就像使用 Apache 或 Tomcat 那样。Node 现在还处于初始阶段,但它发展得很快,可能不久就会出现在您的视野中。 答案来源于网络
养狐狸的猫 2019-12-02 02:17:03 0 浏览量 回答数 0

问题

程序员报错QA大分享(1)

程序员报错QA征集第一弹来了哦~包含QA分享一期征集的部分内容,链接附带解决方案,可收藏哦~ npm install安装依赖一直报错?报错https://developer.aliyun.com/ask/301...
问问小秘 2020-06-18 15:46:14 1684 浏览量 回答数 2

问题

【精品问答】云解析DNS生成问答测试模板

基本定义 什么是云解析DNS? https://developer.aliyun.com/ask/275059 云解析DNS有什么优势? https://developer.aliyun.com/ask/2...
montos 2020-04-09 18:42:36 5 浏览量 回答数 1

回答

内核优化 编辑   /etc/sysctl.conf net.ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0kernel.sysrq = 0kernel.core_uses_pid = 1net.ipv4.tcp_syncookies = 1kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296net.ipv4.tcp_max_tw_buckets = 6000net.ipv4.tcp_sack = 1net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_rmem = 4096 87380 4194304net.ipv4.tcp_wmem = 4096 16384 4194304net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.core.netdev_max_backlog = 262144net.core.somaxconn = 262144net.ipv4.tcp_max_orphans = 3276800net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 94500000 915000000 927000000net.ipv4.tcp_fin_timeout = 1net.ipv4.tcp_keepalive_time = 30net.ipv4.ip_local_port_range = 1024 65000 再输入 /sbin/sysctl -p 使其生效 Conf 设置 worker_processes 2 # 2 就是服务器的核心数worker_cpu_affinity 01 10 # 填法和服务器的线程数相关,一般云服务器/vps 线程和核心数是一致的,具体写法不展开。 如果是 tengine 的话,后面直接填 auto 即可。 worker_connections  #用高效的event驱动,可以获得最大性能 其他的参数最好根据你的服务器配置进行调整,以避免 502 的产生。 TCP 优化 http { sendfile on; tcp_nopush on; tcp_nodelay on;keepalive_timeout 60; 第一行的 sendfile 配置可以提高 Nginx 静态资源托管效率。sendfile 是一个系统调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销。 TCP_NOPUSH 是 FreeBSD 的一个 socket 选项,对应 Linux 的 TCP_CORK,Nginx 里统一用 tcp_nopush 来控制它,并且只有在启用了 sendfile 之后才生效。启用它之后,数据包会累计到一定大小之后才会发送,减小了额外开销,提高网络效率。 TCP_NODELAY 也是一个 socket 选项,启用后会禁用 Nagle 算法,尽快发送数据,可以节约 200ms。Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay。 ------------------------- Socket 连接 php-fpm修改 php-fpm.conf将listen = 127.0.0.1:9000改为listen = /dev/shm/php-cgi.sock修改 nginx.conflocation ~ .*\.(php|php5)?$ { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; }事后不要忘记重启就好。反代优化Nginx 安装时,或者升级时编译 ngxcachepurge 组件以反代 Node.js 应用 Ghost 为例:server {     server_name domain.com;   add_header X-Cache $upstream_cache_status;   location / {        proxy_cache STATIC;        proxy_cache_valid 200 30m;        proxy_cache_valid 404 1m;        proxy_pass http://127.0.0.1:2368;        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;        proxy_ignore_headers Set-Cookie;        proxy_hide_header Set-Cookie;        proxy_hide_header X-powered-by;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header Host $http_host;        expires 10m;    }    location /content/images {        alias /path/to/ghost/content/images;        access_log off;        expires max;    }    location /assets {        alias /path/to/ghost/content/themes/uno-master/assets;        access_log off;        expires max;    }    location /public {        alias /path/to/ghost/core/built/public;        access_log off;        expires max;    }    location /ghost/scripts {        alias /path/to/ghost/core/built/scripts;        access_log off;        expires max;    }    location ~ ^/(?:ghost|signout) {         proxy_set_header X-Real-IP $remote_addr;        proxy_set_header Host $http_host;        proxy_pass http://127.0.0.1:2368;        add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0";    }}HTTP/2 + 优化因为 Nginx 稳定支持HTTP/2 的 1.10 版本还没有出,所以暂时不写。可以先参考 SPDY:或许是 Nginx 下 SPDY 配置最实际的教程开启 Gzip对于文本文件,在服务端发送响应之前进行 GZip 压缩也很重要,通常压缩后的文本大小会减小到原来的 1/4 - 1/3。http { gzip on; gzip_vary on; gzip_comp_level 6; gzip_buffers 16 8k; gzip_min_length 1000; gzip_proxied any; gzip_disable "msie6";gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; ... ...}PageSpeed 优化缓存——让你应用的数据和逻辑完全避免使用网络减少回应时间——减少一连串请求-响应周期的数量减小请求大小——减少上传大小减小有效负荷大小——减小响应、下载和缓存页面的大小优化浏览器渲染——改善浏览器的页面布局 谷歌推出的很好很强大的优化软件,由于篇幅有限,所以请自行搜索安装教程 来自: https://www.vobe.io/378
妙正灰 2019-12-01 23:30:49 0 浏览量 回答数 0

问题

静态文件服务器回传页面带参数问题

我用Node.js做静态文件服务器,包括页面也通过REST返回。但是有些页面是根据请求者的参数显示不同内容的,我现在只能是单纯地返回页面文件,不知道怎么把参数传入到页面内的逻辑中。有没有什么办法?...
杨冬芳 2019-12-01 19:57:37 1185 浏览量 回答数 1

回答

为保证API的安全调用,在调用API时,阿里云ENS会对每个API请求通过签名(Signature)进行身份验证。无论您使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。 说明 阿里云ENS提供了多种编程语言的SDK及第三方SDK,可以省略计算签名步骤,SDK下载请单击阿里云SDK中心。 RAM授权 为了确保您的账号安全,建议您使用子账号的身份凭证调用API。如果您使用RAM账号调用API,您需要为该RAM账号创建、附加相应的授权策略。ENS中可授权的资源和接口列表,请参见RAM资源授权,获取AccessKey请参见获取AccessKey。 API签名 ENS服务会对每个API请求进行身份验证,无论您使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。具体签名计算方法,请参见签名机制。 ENS通过使用AccessKey ID和AccessKey Secret进行对称加密的方法来验证请求的发送者身份。AccessKey是为阿里云账号和RAM用户发布的一种身份凭证(类似于用户的登录密码),其中AccessKey ID用于标识访问者的身份,AccessKey Secret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 以StartInstanceAPI为例,假设使用的AccessKeyId为testid, AccessKeySecret为testsecret。 签名前的请求URL如下: https://ens.aliyuncs.com/?Action=StartInstance &InstanceId=testId &Format=xml &AccessKeyId=testid &SignatureMethod=HMAC-SHA1 &SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf &Version=2017-11-10 &SignatureVersion=1.0 使用testsecret&,计算得到的签名值是: Y8c1u47r2gHn6scXqz92wklKws1= 将签名作为Signature参数加入到URL请求中,最后得到的URL为: https://ens.aliyuncs.com/?Action=StartInstance &InstanceId=testId &Format=xml &AccessKeyId=testid &SignatureMethod=HMAC-SHA1 &SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf &Version=2017-11-10 &SignatureVersion=1.0&Signature=Y8c1u47r2gHn6scXqz92wklKws1= 阿里云为您提供了多种编程语言SDK签名示例代码。 PHP 签名示例 Python签名示例 .NET 签名示例 Go 签名示例 Node.js 签名示例 C/C++ 签名示例
保持可爱mmm 2020-03-29 16:29:06 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 本次活动特邀百位阿里技术专家对Java常...
管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

为保证API的安全调用,在调用API时,阿里云RTC会对每个API请求通过签名(Signature)进行身份验证。无论您使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。 说明 阿里云RTC提供了多种编程语言的SDK及第三方SDK,可以省略计算签名步骤,SDK下载请单击阿里云SDK中心。 RAM授权 为了确保您的账号安全,建议您使用子账号的身份凭证调用API。如果您使用RAM账号调用API,您需要为该RAM账号创建、附加相应的授权策略。RTC中可授权的资源和接口列表,请参见RAM资源授权,获取AccessKey请参见获取AccessKey。 API签名 RTC服务会对每个API请求进行身份验证,无论您使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。 RTC通过使用AccessKey ID和AccessKey Secret进行对称加密的方法来验证请求的发送者身份。AccessKey是为阿里云账号和RAM用户发布的一种身份凭证(类似于用户的登录密码),其中AccessKey ID用于标识访问者的身份,AccessKey Secret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 以CreateChannelAPI为例,假设使用的AccessKeyId为testid, AccessKeySecret为testsecret。 签名前的请求URL如下: https://rtc.aliyuncs.com/?Action=CreateChannel &AppId=a2h1**** &ChannelId=juz**** &Format=XML &AccessKeyId=testid &SignatureMethod=HMAC-SHA1 &SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf &Version=2018-01-11 &SignatureVersion=1.0 使用testsecret&,计算得到的签名值是: Y8c1u47r2gHn6scXqz92wklKws1= 将签名作为Signature参数加入到URL请求中,最后得到的URL为: https://rtc.aliyuncs.com/?Action=CreateChannel &AppId=a2h1**** &ChannelId=juz**** &Format=XML &AccessKeyId=testid &SignatureMethod=HMAC-SHA1 &SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf &Version=2018-01-11 &SignatureVersion=1.0 &Signature=Y8c1u47r2gHn6scXqz92wklKws1= 阿里云为您提供了多种编程语言SDK签名示例代码。 PHP 签名示例 Python签名示例 .NET 签名示例 Go 签名示例 Node.js 签名示例 C/C++ 签名示例
保持可爱mmm 2020-03-29 17:11:10 0 浏览量 回答数 0

问题

如何使用表格存储的 API

应用程序可以使用阿里云官方发布的表格存储 SDK 来访问表格存储,也可以通过 POST 方法发送 HTTP 请求来访问表格存储。 以下将介绍 HTTP 请求结构和数据格式,以及如何构造 HTTP 请求和解析 HT...
云栖大讲堂 2019-12-01 20:58:54 1796 浏览量 回答数 0

问题

社区系统 Icarus 1.3.0

开源协议 ZLIB 免费且商业友好,这个协议基本上和MIT相同。 特性 全局 文件上传(七牛云) 超宽屏支持 简易的移动端支持 实时在线人数 Markdown发帖和评论 ...
寒喵 2019-12-01 21:51:20 1292 浏览量 回答数 0

问题

REST API鉴权

鉴权方法说明 通过RESTful API调用智能语音服务,首先您需要拥有AccessKey( 点击 这里创建和管理您的AccessKey),AccessKey相当于您访问阿里云产品...
nicenelly 2019-12-01 21:01:17 1948 浏览量 回答数 0

回答

背景 目前有很多 web 应用是基于 express 框架写的,这样的 web 应用按照传统的部署方式可能部署在云主机上,用户可能不想购买云主机,也不想在运维上投入太多成本,函数计算是一个不错的选择,函数计算的入口方法如何适配 express 是一个相当复杂的问题,我们需要适配 http 触发器和 API 网关这两种类型的触发,但是这两种类型的函数方法签名是不一样的,我们需要分别做适配,比如 API 网关方式触发函数,需要把 event 映射到 express 的 request 对象上,而 express 的 response 对象需要映射到 callback 的数据参数上。具体细节可以参考另一篇文章:移植 express.js 应用到函数计算。 现在,我们提供了一个模板,通过该模板,可以快速将 express 项目接入函数计算,不管你的函数希望通过 http 触发器,还是 API 网关触发。并且,该模板还支持 es6 代码编译成 es5,并且剪切打包压缩成一个 js 文件。 快速开始 安装 node curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.5/install.sh | bash nvm install 8 安装 fun 工具 npm install @alicloud/fun -g fun 工具的某些子命令可能会用到 docker,所以你需要安装好 docker,具体参考文档:Fun 安装教程。 通过 fun 模板生成项目 fun init -n demo https://github.com/muxiangqiu/fc-express-nodejs8.git 项目生成好后,在根目录下有个 README.md 文件,阅读该文件可以帮你快速了解项目骨架为你做了什么,以及相关的命令。具体详情:README.md。 安装依赖 cd demo # 切换到项目根下面,后面的所有命令,都是在项目根下面执行 npm install 注意:有少数特殊 npm 模块的安装可能会依赖当前系统环境,为了能正确安装函数运行时的系统环境的 npm 模块,可以通过 fun install 命令来实现,比如 puppeteer,具体参考:开发函数计算的正确姿势 —— 安装第三方依赖。 编译 生产编译 npm run build 开发编译(这种编译方式不会进行代码混淆,并且生成 source map 信息,方便开发调试) npm run dev 本地运行函数 fun local start 运行调试函数 运行调试之前,请先用 npm run dev 命令编译源码,然后以调试的方式运行函数: fun local start -d 3000 如下图所示:debug_fc_http 部署函数到云端 部署函数的时候需要用到 AK 等下信息,可以通过 fun config 来配置,如果配置过请忽略,部署函数命令如下: fun deploy 小结 通过该模板,我们可以快速让 express 在函数计算上运行起来,你的原生请求的 headers 或者 body 都会透传给你的 express 应用,你不用关心是如何透传过去的,这些对你来说都是透明的,你只需要按照 express 标准方式写你的业务代码即可。如果你想要了解更多底层实现原理,可以参考另一篇文章:移植 express.js 应用到函数计算。
1934890530796658 2020-03-27 17:34:49 0 浏览量 回答数 0

回答

1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 undefined 与 undeclared 的区别? 7 null 和 undefined 的区别? 8 如何获取安全的 undefined 值? 9 说几条写 JavaScript 的基本规范? 10 JavaScript 原型,原型链? 有什么特点? 11 js 获取原型的方法? 12 在 js 中不同进制数字的表示方式? 13 js 中整数的安全范围是多少? 14 typeof NaN 的结果是什么? 15 isNaN 和 Number.isNaN 函数的区别? 16 Array 构造函数只有一个参数值时的表现? 17 其他值到字符串的转换规则? 18 其他值到数字值的转换规则? 19 其他值到布尔类型的值的转换规则? 20 {} 和 [] 的 valueOf 和 toString 的结果是什么? 21 什么是假值对象? 22 ~ 操作符的作用? 23 解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字,它们之间的区别是什么? 24 + 操作符什么时候用于字符串的拼接? 25 什么情况下会发生布尔值的隐式强制类型转换? 26 || 和 && 操作符的返回值? 27 Symbol 值的强制类型转换? 28 == 操作符的强制类型转换规则? 29 如何将字符串转化为数字,例如 '12.3b'? 30 如何将浮点数点左边的数每三位添加一个逗号,如 12000000.11 转化为『12,000,000.11』? 31 常用正则表达式? 32 生成随机数的各种方法? 33 如何实现数组的随机排序? 34 javascript 创建对象的几种方式? 35 JavaScript 继承的几种实现方式? 36 寄生式组合继承的实现? 37 Javascript 的作用域链? 38 谈谈 This 对象的理解。 39 eval 是做什么的? 40 什么是 DOM 和 BOM? 41 写一个通用的事件侦听器函数。 42 事件是什么?IE 与火狐的事件机制有什么区别? 如何阻止冒泡? 43 三种事件模型是什么? 44 事件委托是什么? 45 ['1', '2', '3'].map(parseInt) 答案是多少? 46 什么是闭包,为什么要用它? 47 javascript 代码中的 'use strict'; 是什么意思 ? 使用它区别是什么? 48 如何判断一个对象是否属于某个类? 49 instanceof 的作用? 50 new 操作符具体干了什么呢?如何实现? 51 Javascript 中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是? 52 对于 JSON 的了解? 53 [].forEach.call($$(''),function(a){a.style.outline='1px solid #'+(~~(Math.random()(1<<24))).toString(16)}) 能解释一下这段代码的意思吗? 54 js 延迟加载的方式有哪些? 55 Ajax 是什么? 如何创建一个 Ajax? 56 谈一谈浏览器的缓存机制? 57 Ajax 解决浏览器缓存问题? 58 同步和异步的区别? 59 什么是浏览器的同源政策? 60 如何解决跨域问题? 61 服务器代理转发时,该如何处理 cookie? 62 简单谈一下 cookie ? 63 模块化开发怎么做? 64 js 的几种模块规范? 65 AMD 和 CMD 规范的区别? 66 ES6 模块与 CommonJS 模块、AMD、CMD 的差异。 67 requireJS 的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?) 68 JS 模块加载器的轮子怎么造,也就是如何实现一个模块加载器? 69 ECMAScript6 怎么写 class,为什么会出现 class 这种东西? 70 documen.write 和 innerHTML 的区别? 71 DOM 操作——怎样添加、移除、移动、复制、创建和查找节点? 72 innerHTML 与 outerHTML 的区别? 73 .call() 和 .apply() 的区别? 74 JavaScript 类数组对象的定义? 75 数组和对象有哪些原生方法,列举一下? 76 数组的 fill 方法? 77 [,,,] 的长度? 78 JavaScript 中的作用域与变量声明提升? 79 如何编写高性能的 Javascript ? 80 简单介绍一下 V8 引擎的垃圾回收机制 81 哪些操作会造成内存泄漏? 82 需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案? 83 如何判断当前脚本运行在浏览器还是 node 环境中?(阿里) 84 把 script 标签放在页面的最底部的 body 封闭之前和封闭之后有什么区别?浏览器会如何解析它们? 85 移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时? 86 什么是“前端路由”?什么时候适合使用“前端路由”?“前端路由”有哪些优点和缺点? 87 如何测试前端代码么? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)? 88 检测浏览器版本版本有哪些方式? 89 什么是 Polyfill ? 90 使用 JS 实现获取文件扩展名? 91 介绍一下 js 的节流与防抖? 92 Object.is() 与原来的比较操作符 '==='、'==' 的区别? 93 escape,encodeURI,encodeURIComponent 有什么区别? 94 Unicode 和 UTF-8 之间的关系? 95 js 的事件循环是什么? 96 js 中的深浅拷贝实现? 97 手写 call、apply 及 bind 函数 98 函数柯里化的实现 99 99. 为什么 0.1 + 0.2 != 0.3?如何解决这个问题? 100 原码、反码和补码的介绍 101 toPrecision 和 toFixed 和 Math.round 的区别? 102 什么是 XSS 攻击?如何防范 XSS 攻击? 103 什么是 CSP? 104 什么是 CSRF 攻击?如何防范 CSRF 攻击? 105 什么是 Samesite Cookie 属性? 106 什么是点击劫持?如何防范点击劫持? 107 SQL 注入攻击? 108 什么是 MVVM?比之 MVC 有什么区别?什么又是 MVP ? 109 vue 双向数据绑定原理? 110 Object.defineProperty 介绍? 111 使用 Object.defineProperty() 来进行数据劫持有什么缺点? 112 什么是 Virtual DOM?为什么 Virtual DOM 比原生 DOM 快? 113 如何比较两个 DOM 树的差异? 114 什么是 requestAnimationFrame ? 115 谈谈你对 webpack 的看法 116 offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别? 117 谈一谈你理解的函数式编程? 118 异步编程的实现方式? 119 Js 动画与 CSS 动画区别及相应实现 120 get 请求传参长度的误区 121 URL 和 URI 的区别? 122 get 和 post 请求在缓存方面的区别 123 图片的懒加载和预加载 124 mouseover 和 mouseenter 的区别? 125 js 拖拽功能的实现 126 为什么使用 setTimeout 实现 setInterval?怎么模拟? 127 let 和 const 的注意点? 128 什么是 rest 参数? 129 什么是尾调用,使用尾调用有什么好处? 130 Symbol 类型的注意点? 131 Set 和 WeakSet 结构? 132 Map 和 WeakMap 结构? 133 什么是 Proxy ? 134 Reflect 对象创建目的? 135 require 模块引入的查找方式? 136 什么是 Promise 对象,什么是 Promises/A+ 规范? 137 手写一个 Promise 138 如何检测浏览器所支持的最小字体大小? 139 怎么做 JS 代码 Error 统计? 140 单例模式模式是什么? 141 策略模式是什么? 142 代理模式是什么? 143 中介者模式是什么? 144 适配器模式是什么? 145 观察者模式和发布订阅模式有什么不同? 146 Vue 的生命周期是什么? 147 Vue 的各个生命阶段是什么? 148 Vue 组件间的参数传递方式? 149 computed 和 watch 的差异? 150 vue-router 中的导航钩子函数 151 两个router 的区别? 152 vue 常用的修饰符? 153 computed 和 watch 区别? 154 keep-alive 组件有什么作用? 155 vue 中 mixin 和 mixins 区别? 156 开发中常用的几种 Content-Type ? 157 如何封装一个 javascript 的类型判断函数? 158 如何判断一个对象是否为空对象? 159 使用闭包实现每隔一秒打印 1,2,3,4 160 手写一个 jsonp 161 手写一个观察者模式? 162 EventEmitter 实现 163 一道常被人轻视的前端 JS 面试题 164 如何确定页面的可用性时间,什么是 Performance API? 165 js 中的命名规则 166 js 语句末尾分号是否可以省略? 167 Object.assign() 168 Math.ceil 和 Math.floor 169 js for 循环注意点 170 一个列表,假设有 100000 个数据,这个该怎么办? 171 js 中倒计时的纠偏实现? 172 进程间通信的方式? 173 如何查找一篇英文文章中出现频率最高的单词? 174 174道 JavaScript 面试题,合集
剑曼红尘 2020-04-02 14:05:35 0 浏览量 回答数 0

回答

学习路径 由浅入深,带您玩转Web应用托管服务。 了解 Web+介绍 什么是Web+ 应用场景 产品优势 基本概念 上手 快速入门 开通相关服务并授权 在控制台快速部署应用 在CLI快速部署应用 通过模板搭建环境 使用 应用管理 部署应用 应用详情概览 应用部署包版本管理 配置模板管理 配置部署环境 域名托管 反向代理服务器 专有网络 ECS实例 负载均衡SLB 云数据库RDS 配置服务端口 健康检查 命令与生命周期挂钩 环境变量 Java虚拟机参数 实践 技术栈 Tomcat Java Node.js Go PHP Python .NET Core Ruby Native 开发 CLI 安装升级Wpctl CLI命令 部署环境配置项说明 API参考 API概览 调用方式 签名机制 RAM鉴权 公共请求和返回头 公共错误码 热门文档 什么是Web应用托管服务 开通Web+相关服务并授权 在Web+控制台快速部署应用 热门视频 在控制台部署应用 在控制台变更环境配置 在CLI部署应用 安装和配置命令行工具
1934890530796658 2020-03-23 13:45:00 0 浏览量 回答数 0

回答

Beego https://beego.me/ Beego 框架提供了很多标准附加功能,例如全功能路由器和可用于执行 CRUD 操作的对象到数据库映射工具。Bee 是 Beego 爱好者的最爱,它是一个快速而强大的命令行工具,用于构建、更新、打包和部署应用程序。Bee 可以从模板生成源代码,并保持数据库的最新状态。 Buffalo https://gobuffalo.io/en Buffalo 团队需要能够将 Web 应用程序的所有部分组装在一起的东西,包括应用程序本身的一些设计。他们把能够安装在一起的很多部件叫作“生态系统”。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 倾向于使用 Plush,而不是使用内置的 Go 语言模板机制。数据库连接模块集合 Pop 可以帮你将数据库信息转换为 Go 对象。你还可以找到连接数据库、处理 cookie 以及完成其他任务的标准方法。 Cobra https://github.com/spf13/cobra 有时候,你只需要一个命令行界面。Cobra 提供了 CLI 的所有标准功能,因此你不必浪费时间实现代码来查找 -h 或 -help 标志。如果你的微服务需要对具有大量标志和其他功能的命令行调用做出响应,那么可以考虑集成 Cobra。 Docker 你当然可以在办公室服务器小黑屋里的裸机上运行微服务,但越来越多的人将他们的代码捆绑在 Docker 容器中,并将容器发到云端。小型的包更容易处理大量不同的代码块,当你对微服务架构的愿景要求你创建很多小的独立代码块时,这将是一项有价值的服务。 值得一提的是,Docker 是用 Go 语言开发的,尽管在部署 Docker 容器时你可能永远不会想到这一点。Docker 社区版是开源的,所以如果有必要,你可以参与其中,但很可能你只是将 Docker 作为部署微服务的工具。Go 语言爱好者之所以想要记住 Docker 是用 Go 语言开发的这一事实,是因为无处不在的 Docker 有力地证明了他们对这门语言的支持。 Echo https://echo.labstack.com/ Echo 是一个极简框架,但它提供了很多最重要的组件。路由器可以将 URL 拆解,然后将拆解的各个部份转换为参数,因此你无需自行解析它们。然后,你可以混合使用身份验证、表单解析、压缩和合理性限制。你可以专注于从函数中返回正确的信息。 Errors https://github.com/juju/errors 有时候,API 的用户会传递错误的参数。你可以自己处理这些参数,也可以把它们创给 Errors,这是一个可以自动执行大部分跟踪的库,方便进行调试。当发生错误时,Errors 会使用注释来详细说明出错的地方和位置。 Gin https://github.com/gin-gonic/gin Gin 是 Martini( https://github.com/go-martini/martini )的下一代框架。可以说,Gin 抛弃了那些额外的东西,专注于提供最有用的部分。花费大量时间构建 Node.js 微服务的开发人员会感到宾至如归。你可以实例化一个对象,然后附加函数来处理特定的调用,这样就可以创建一个微服务。Gin 负责处理路由,而你的函数处理业务逻辑。如果不去考虑标点符号,它的代码甚至看起来有点像 Node.js 代码。 Ginkgo https://onsi.github.io/ginkgo/ 测试可能是微服务开发当中最具挑战性的事情。Ginkgo 通过行为驱动测试扩展了标准 Go 发行版的内置测试机制。Ginkgo 提供了一种高级机制,用于指定函数或服务应该产生哪些结果。结果通常使用 Ginkgo 提供的 Gomega 匹配器( http://onsi.github.io/gomega/ )进行评估,但如果你愿意,也可以使用不同的匹配器库。 Ginkgo 是一个全面的框架,提供了各种选项,用于设置测试数据、运行测试以及在事后释放测试数据。你只需要描述结果,然后让 Ginkgo 处理其他的事情。 Goa https://github.com/goadesign/goa 如果你是一个曾经使用 Ruby 和 Praxis 框架的开发人员,或者是一个欣赏设计语言的强大力量人,那么你会在 Goa 中找到很多你喜欢的东西。你本身不需要编写 Go 代码。你使用 Goa DSL 为 API 编写设计规范,然后 Goa 将其转换为可执行的 Go 代码。DSL 针对微服务 API 进行了优化,并强制你的设计遵循标准的架构。 Gorilla http://www.gorillatoolkit.org/ Gorilla 项目提供了一系列你需要的模块。Gorilla 的 Mux( http://www.gorillatoolkit.org/pkg/mux )路由器被很多其他框架使用,因为它太好用了。很多用户之所以使用 Gorilla,是因为 websocket( http://www.gorillatoolkit.org/pkg/websocket )。 Gotify https://github.com/gotify/server 同步一组微服务所面临的一个挑战是建立有效的消息传递节点。Gotify 是一个简单的服务器,用于发送和接收消息,将你的微服务集合与持续存储的消息组合在一起。最有用的部分可能是它的 Web 接口,可帮助开发者应对最令人头疼的调试问题。 Hugo https://github.com/gohugoio/hugo Hugo 是一种静态站点生成器,可以用这个框架构建的微服务并不多,但如果网站只有有限的重复查询答案时,这是一个值得考虑的选项。Hugo 一次生成答案,然后可以重复使用。如果你已经已 HTML 格式提供答案,那么 Hugo 会非常有用。 Kite https://github.com/koding/kite 如果你希望建立一个更加可控的服务群体,而不是通常的服务之间的互动,那么可以考虑一下 Kite。Kite 的目标是让微服务之间的通信协调变得更简单一些。来自 Kite 以外的 API 调用通过 websocket 进入,然后 Kite 使用更快、更低级别的套接字连接(基于 dnode)传递新消息。中间有一个叫作 Kontrol 的服务注册表和身份验证服务。如果你需要经常交换消息和协调很多的操作,那么在不同服务器之间添加这一层会让一切变得更快。 Logrus https://github.com/sirupsen/logrus 要跟踪 API 的流入和流出数据和可能产生的错误,通常需要将日志写入文件中。这个过程可以很简单,比如在一个打开的文件中写入一行行的数据,但通常使用完整的日志框架会更好。Logrus 提供了格式化程序来标准化你的日志输出,并让后续的自动化日志文件分析变得更容易。不要尝试自己开发日志代码,使用像 Logrus 这样的库会事半功倍。 Nano https://github.com/pasztorpisti/nano 构建一个微服务并不需要太多东西,Nano 就是一个极简主义的例子。它的实际代码不会超过 200 行,如果算上注释也只有 400 多行。你只需要几行代码就可以构建一个微服务——只包含处理请求所需的业务逻辑。这个框架还有一些其他不错的特性,例如与语言无关的 API 结构,这样你的 Go 代码就可以与使用其他语言开发的服务发生交互。它还提供了一个测试过程来,可以嵌入你的本地测试例程。简简单单,但却恰到好处。 Negroni https://github.com/urfave/negroni 有些人看完 Martini 后,决定走一条更简单的道路。他们剥离了路由器和其他一些东西,创建了 Negroni,这是一个非常小型的工具,除了处理标准文件、自定义请求、从基本错误中恢复以及保留日志之外,它不会做更多的工作。如果你想要额外的东西,可以自己加入。Negroni 团队也提供了一系列与可以与 Negroni 一起使用的小型项目。 Renderer https://github.com/thedevsaddam/renderer 在准备输出响应时,你需要获取数据并将其插入到模板中。Renderer 提供了各种输出格式(JSON、JSONP、XML、YAML、HTML、文件)和一个漂亮、快速和标准的模板引擎。 Revel https://revel.github.io/ Revel 借鉴了 Webpack 的一个简洁的特性,这让 Revel 看起来就像一个 IDE 一样,或者至少是 IDE 的一部分,每当你对代码做出更改,它会持续地重新构建你的项目。当你保存修改后,Revel 会检测到更改,然后就编译代码,如果没有编译错误,就启动应用程序。因此,Revel 服务器会自动部署修改的码——在桌面上进行开发时这项功能非常好用,或许对于生产环境代码部署来说也是有点诱人的。 这个框架本身功能齐全,它提供了模板、缓存、验证和过滤器。如果你正在构建很多微服务,它还提供了一个模块系统,让你可以在项目之间共享一些 MVC 组件。 Testify https://github.com/stretchr/testify 使用断言的最简单方法之一是使用 Testify,它是一个 Go 语言项目,还提供了模拟工具,用于快速测试大型微服务的各个部分。只需要几行代码就编写一些基本测试用例。 Tollbooth https://github.com/didip/tollbooth 在你发布 API 之后,当然希望来自世界各个角落的人都可以调用它。但当你的服务器发生熔断,或者你看一看为了获得弹性而为云托管账户支付的费用时,你可能会改变主意。Tollbooth 是一个用于限制传入请求的轻量级系统。限制前门的流量就等于减少了对管道中微服务或数据库的需求,让一切保持运行顺畅。 不使用框架 你只需从头开始编写 Go 代码,不需要导入任何依赖项或者实例化任何控制对象。使用 Go 语言创建微服务其实很容易,因为它已经内置了很多基本代码。这就是为什么只用几百行代码就可以构建出像 Nano 这样的框架。 监听套接字、解压缩 HTTP 请求等工作都是通过标准库完成的。虽然框架提供了一些额外的功能,但很多时候如果你需要一个非常基本的微服务,就不需要用到框架。太多的“附加功能”可能反而会妨碍你,而且 Go 开发人员可能会说,太多的依赖反而让 Go 语言变得更复杂。
有只黑白猫 2020-01-08 11:53:57 0 浏览量 回答数 0

问题

短信查询API(QuerySendDetails)---Node.js

短信发送记录查询接口(QuerySendDetails) 用于查询短信发送的状态,是否成功到达终端用户手机 入参列表 参数名称参数类型必填与否样例取值参数说明PhoneNumberString必须150000000...
nicenelly 2019-12-01 20:57:48 1360 浏览量 回答数 0

回答

OpenAPI Explorer致力于帮助您更快地查找阿里云云产品API 、更便捷地使用阿里云的API进行二次开发 。您可以使用OpenAPI Explorer 来检索阿里云开放了哪些API、查看API定义,适用于API调试、故障排查等场景。 • API调试 在基于阿里云API进行二次开发前,您可以预先验证API请求方式和查看API的返回结果。OpenAPI Explorer提供了网页和命令行两种方式,让您直观的查看API的调用结果。而且,当调用出错时,OpenAPI Explorer还会提示您如何解决。 • 查看SDK示例 在您使用SDK进行开发时,往往需要一些代码示例来辅助您进行开发。在OpenAPI Explorer中输入API请求参数的同时,会帮您生成Java、PHP、Python、Node.js的示例代码,以引导您进行开发。
LiuWH 2020-03-26 08:08:29 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板