Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

Material Design 设计风格的博客上线了

$
0
0

我的第二版博客上线了,本次采用 Material-ui 作为 UI 组件库,整个博客分为三个项目: 管理后台(Recatch)/后台服务(Recatch-service)/前端界面(Recatch-ui). 线上地址. 项目地址: 管理后台博客主页后台服务博客管理后台实现功能: 1、数据概览 实现一个简单的站点数据概览功能 image.png 2、文章管理 该模块主要进行文章的增加修改和删除操作: image.png 3、标签管理 该模块主要进行标签的增删操作: image.png 4、评论管理 对文章的评论进行管理 image.png 5、项目管理模块 该模块主要用于编辑个人项目,用于前端界面展示 image.png 6、友链管理 博客首页支持访客增加友链申请,后端管理界面可以用于审核 image.png

博客主页: 1、博客文章预览 image.png 2、项目列表页 image.png 3、友链墙 image.png

欢迎交流 ;)


有用thinkjs2做后台的吗

$
0
0

怎么配置session和cookie让它保持登录呢?下面这段代码有问题吗?

  init(http){
       console.log('init base')
	      var self = this;
	      super.init(http);
        self.assign({
          productImgPath:productImgUrl,
          globalFid:0
        })
        //var userInfo = self.session('userInfo');
        //console.log(userInfo);
	      return self.session('userInfo').then(function (userInfo) {
	        if (isEmpty(userInfo)) {
	          self.assign({
	            loginStatus: 0,
	            userInfo: {}
	          })
	        } else {
            console.log(userInfo);
	          self.assign({
	            loginStatus: 1,
	            userInfo: userInfo
	          })
	        }
	      return Promise.resolve();
	      })
	    };

基于 React 和 antd 的 cnode web 客户端

$
0
0

我是一个 nodejs 和 cnodejs 的忠实粉丝

目前正在学习 React,就基于 React 和 antd 写了个 cnodejs 的 web 客户端作为案例

api 是 cnodejs 官方的 api

目前只完成了基本的文章浏览和板块的切换,还有很多工作正在进行中

欢迎各位朋友体验和提意见~

【地址】http://cnode.dzmtoast.top

thinkjs 2.2 init()使用有问题

$
0
0

当 let userInfo = await self.session(‘userInfo’); 在self.assign()前传不到模板数据,在后面就可以,怎么回事啊

	      var self = this;
        super.init(http);
        self.assign({
            loginStatus:0,
            globalFid:0,
            userInfo:userInfo
        })
        let userInfo = await self.session('userInfo');
 }

node写爬虫的问题

$
0
0

数据量不是特别大,但有很多层循环嵌套,程序很多时候跑到一半终端就未响应了。。。不报错,也不再继续执行,,,

async function init(_s, _e) { 
   for (let _i = _s; _i < _e; _i++) {
        let _isexists = fs.existsSync(`page_${_i}`);
        let _mk = 0;      
        if (_isexists == false){
            fs.mkdirSync(`${__dirname}/page_${_i}`)
        }
        if (!_mk) {
            console.log(`>>正在分析页面-${_i}`)
            let data = await whttps.gets('https://www.thefashionisto.com/fashion/campaign/?vpage=' + _i)
            if (data) {
                $ = cheerio.load(data);
                console.log('>>分析页面完成,加载整个dom文档,获得所需要的二级url')
            }
            $('._self').each(async function(i, item) {
                if ($(this).html() == 'Read More') {
                    let curl = $(this).attr('href');
                    let cdata = await whttps.gets(curl); 
                   

					if (cdata) {
                        let name = curl.replace(/(https:\/\/.*?\/)|(\/)/g, ''); 
                       console.log(`${__dirname}/page_${_i}/${name}`)
                        let isexists = fs.existsSync(`${__dirname}/page_${_i}/${name}`); 
                       let mk_r = 0; 
                       if (isexists == false) {
                            mk_r = fs.mkdirSync(`${__dirname}/page_${_i}/${name}`)
                                // console.log('建立文件夹后的结果', mk_r)
                        };
                        if (!mk_r) {
                            c$ = cheerio.load(cdata); 
                           console.log(`>> 获得详情页面,分析详情页面图片`); 
                           c$('.entry-content figure img').each(async function(i) {
                                let img_url = c$(this).attr('src');
                                let img_name = img_url.replace(/(.*\/)|(\..*)/g, ''); 
                               if (fs.existsSync(`${__dirname}/page_${_i}/${name}/${img_name}.jpg`)) { 
                                   console.log('文件存在,跳过该图片'); 
                               } else {
                                    let img_data = await whttps.gets(img_url, 'binary') 
                                   if (img_data) {
                                        
                                    fs.writeFile(`${__dirname}/page_${_i}/${name}/${img_name}.jpg`, img_data, 'binary', 
									function(error) {
                                            if (error) {
                                                console.log(error);
												return false
                                            };
											console.log(`>> 图片${img_name}保存成功`)
                                        })
                                    }
                                }
                            }); 
                           let relation_img = await whttps.gets(curl + '?relatedposts=1')
                            relation_img = JSON.parse(relation_img)
                            relation_img.items.forEach(async(element, i) => {
                                let img_url = element.img.src; 
                               let img_name = img_url.replace(/(.*\/)|(\..*)/g, ''); 
                               if (fs.existsSync(`${__dirname}/page_${_i}/${name}/small-${img_name}.jpg`)) { 
                                   console.log('文件存在,跳过该图片') 
                               } else { 
                                   let img_data = await whttps.gets(img_url, 'binary') 
                                   if (img_data) { 
                                       fs.writeFile(`${__dirname}/page_${_i}/${name}/small-${img_name}.jpg`, img_data, 'binary',
									   function(error, data) {
                                            if (error) {
                                                console.log(error)
                                                return false  

                                          }; 
										  console.log(`>> 图片${img_name}保存成功`) 
                                       })
                                    }  
                              }
                            }); 
                       }  
                  }  
              }  
          });  
      } 
   }}

来自酷炫的 CNodeMD

egg中使用socket.io直接就断开连接了?

请问egg.js框架脚手架生成的router.js中的app对象是从哪里来的?

$
0
0

egg的脚手架生成的route.js如下

'use strict';
module.exports = app => {
  const { router, controller } = app;
  app.redirect('/', '/news');
  router.get('/news', controller.news.list);
  router.get('/news/item/:id', controller.news.detail);
  router.get('/news/user/:id', controller.news.user);
};

其中

const { router, controller } = app

中的"app"对象是

module.exports = app

里的这个"app"用箭头函数简写传进来的。但是在整个代码中并没有看到

var app = require(egg.Applications)

的声明, 那么这个app对象到底是在什么时候申明的呢?谢谢!

对于国际手机号码正则校验的

$
0
0

,是一个一个国家校验呢,还是写一个通用的正则校验,目前也看了谷歌的 i18n, 国际手机号码正则校验 /(+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/

看到stackoverflow的问题: https://stackoverflow.com/questions/2113908/what-regular-expression-will-match-valid-international-phone-numbers

请大牛指教下


egg中跨域egg-cors需要设置security白名单,如果egg服务放到服务器,前端本地开发怎么通过所有的访问?

$
0
0

egg-cors的使用需要在egg-security中设置白名单, 我使用前后端分离,前段用vue,两端都在一个电脑,可以设置domainWhiteList:[‘http://localhost:8080’], 如果我要把egg后台放到服务器,那前端本地开发的话白名单怎么设置?domainWhiteList:[’*’]?

如何将ecdh生成的裸私钥转换成pem格式的私钥

$
0
0
const crypto = require('crypto');
const ecdh = crypto.createECDH('secp521r1');
ecdh.generateKeys();
let pubKey = ecdh.getPublicKey();
let privKey = ecdh.getPrivateKey();
//如何将这个privKey转化成可用于crypto.privateEncrypt()加密信息的私钥
//同时pubKey转化成可用于crypto.publicDecrypt()解密信息的公钥

看看是否有大神有解法,如果不使用第三方库的情况

微信小程序可以实现调用外部app应用吗?

$
0
0

微信小程序可以实现调用外部app应用吗?

来自酷炫的 CNodeMD

promise实现求助

$
0
0

萌新按照剖析 Promise 之基础篇学习实现了下promise,但是发现有一个很大的问题,那就是then在promise已改变状态下注册方法,该注册方法不会异步执行,变成了立即执行,请教下各位老哥,代码该如何修改(handle方法),还是说其他方法有问题,亦或是萌新我的理解有误。。。

代码如下:

const PENDING = 0;
const FULFILLED = 1;
const REJECTED = 2;

function SimplePromise(fn) {
  let state = PENDING;
  let value = null;
  let deferreds = [];

  this.then = function (onFulfilled, onRejected) {
    return new SimplePromise (function (resolve, reject) {
      // 当promise某一结果状态处理函数完成后,应将bridge promise状态改变,并向其传递结果值
      handle({
        onFulfilled: onFulfilled || null,
        onRejected: onRejected || null,
        resolve: resolve,
        reject: reject
      });
    });
  }

  function handle(deferred) {
    if (state === PENDING) {
      deferreds.push(deferred);
      return;
    }

    let cb = state === FULFILLED ? deferred.onFulfilled : deferred.onRejected;
    // 当前promise一结果状态未注册相应处理函数,则将状态传递
    if (cb === null) {
      cb = state === FULFILLED ? deferred.resolve : deferred.reject;
      cb(value);
      return;
    }

    try {
      let ret = cb(value);
      deferred.resolve(ret);
    } catch (e) {
      deferred.reject(e);
    }
  }

  function finale() {
    setTimeout(function () {
      deferreds.forEach(deferred => handle(deferred));
    }, 0);
  }

  function resolve(newValue) {
    // 用于处理方法返回的结果是promise
    if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
      let then = newValue.then;
      if (typeof then === 'function') {
        // bridge promise为了获取方法中返回的promise的结果值,向它注册异步操作后的处理函数
        then.call(newValue, resolve, reject);
        return;
      }
    }

    state = FULFILLED;
    value = newValue;
    finale();
  }

  function reject(reason) {
    state = REJECTED;
    value = reson;
    finale();
  }

  function doResolve(fn, resolve, reject) {
    let done = false;
    try {
      fn(function (value) {
        if (done) return;
        done = true;
        resolve(value);
      }, function (reson) {
        if (done) return;
        done = true;
        reject(reson);
      })
    } catch (e) {
      if (done) return;
      done = true;
      reject(e);
    }
  }

  doResolve(fn, resolve, reject);
}

比如在这种情况下会出现问题: 按规范不是应该先打印aaa吗?


function getUserId() {
  return new SimplePromise(function (resolve) {
    resolve(9876);   
  });
}

getUserId()
  .then(function (mobile) {
      console.log('do sth with', mobile);
      return 'ccc';
  })
  .then(console.log);

console.log('aaa');

打印结果:


do sth with 9876
ccc
aaa

参考Super Tiny Compiler,写个模板的编译器来玩玩

$
0
0

实现的功能都好简单.

然后, If 呢? for 呢? repeat呢 ?

抱歉,这都没有.

起因很简单,之前写过一个小项目.

所有的后端的错误代码和错误信息,全都写在一个平台上面,然后一键打包输出成各种语言,比如Typescript/Javascript/Golang/Json。

这样就可以做到,后端抛出的错误,全都是翻译好的(取决于你客户端的语言),前端只需要显示出错误信息就行了

比如像这样,贼好用 1.png

需求很简单,错误信息里面会带有变量 {{xxx}}

恰逢在学习抽象语法树中,练练手,杀鸡用牛刀也没什么不好

试试看?

源码: https://github.com/axetroy/pag

用nodejs做游戏服务器和网站服务器有什么要注意的。有什么区别

【北京/杭州】阿里云业务中台招聘前端/java工程师(可年后入职)

$
0
0

部门介绍:我们是「阿里云事业群-业务中台-体验技术部」,主要负责阿里云售卖中台、自动化营销中台,以及云生态平台:云市场、企业服务、云栖社区、云栖大会等产品。我们对外致力于改善售卖链路优化、营销触达、生态建设、完善文档及api建设,对内focus在营销工具自动化、销售工具智能化和数据化。同时,负责业务中台全栈相关的「工程体系、开发框架、组件体系、工具及平台」的研发工作,以横向支持各产品线和项目组,为部门、为公司提效。我们是技术控,新技术先行者,大平台、多业务可以让你随意发挥,我们看重结果,也看重过程中你的探索;我们非纯技术控,一切技术创新为业务服务,业务智能化、数据化、平台化是我们对业务的追求,我们希望至少做半个pd,深入参与业务讨论。

职位描述:方向一:全栈售卖中台,参与抽象售卖的核心层、场景层、开放api层的建设 方向二:自动化营销中台,参与可视化配置营销体系、底层营销自动化配置体系建设 方向三:生态体系,参与社区、云市场、云栖大会等建设 方向四:平台架构组,参与工程化工具、框架、数据平台等建设

岗位要求:两年以上互联网行业前端工作经验; 基础编程知识牢靠,熟悉面向对象编程、熟悉函数式编程; 前端技术扎实,关注对新事物和技术,熟悉主流前端开发思想; 擅长 JavaScript,熟悉 ES2015,擅长 CSS,了解相关的前端生态; 擅长 React,了解 React 的核心思想,熟悉 Redux/MobX 理解它们解决的问题; 了解前端模块化,能够编写出易于维护的前端代码; 熟悉 Node.js,能够用 Node.js 编写工程工具或 Restful API 会使用 Webpack 或 Gulp 等前端构建工具实现开发流程自动化; 了解测试的重要性,熟悉测试驱动开发,熟练编写单元测试、E2E 测试; 熟练使用常用的 Git 操作,熟悉基于 Git 的常见协作规范及流程; 执行力强,有良好的分析、总结能力,能够有效识别痛点、并找到的解决方案; 良好的团队协作精神、利用自身技术能力提升团队整体研发效率

加分项:参与知名开源项目,或在 GitHub 上有超过 100 star 的个人项目; 熟悉包括但不限于 Java/Go/Python/PHP 等任意一门后端语言;

我们的业余生活:1.jpg2.jpg3.jpg4.jpg5.jpg

简历请发送: xiaoming.dxm@alibaba-inc.com注明 来自cnode,优先面试。


export default class xx extends xx 导致只有一个子类会执行代码

$
0
0

rt,这是什么情况,或者这里该怎么写继承呢?万分感谢!

屏幕快照 2018-01-17 下午8.25.14.png屏幕快照 2018-01-17 下午8.23.59.png

gsssssssssssssssss

$
0
0

gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg

一个奇怪的问题,求老司机解答

$
0
0

直接上图 QQ20180117-215144@2x.jpg最近回顾犀牛书的时候看到这个问题,书上写的比较抽象,想知道

  1. ‘+’和’-’运算符有什么区别?
  2. '+'运算符转string优先还是number优先?

谢谢

在egg中启动自定义cluster失败

$
0
0

尝试在egg中使用自定义启动一组自己写的cluster, 但是却启动不了,cluster的变量也很奇怪,请教一下各位大神

// 自定义启动 app.js
module.exports = app => {
  app.beforeStart(async () => {
    app.cluster = require('./cluster/master');
  });
};
// ./cluster/master.js
const cluster = require('cluster');
console.log('NODE_UNIQUE_ID' in process.env); // false
console.log(cluster.isMaster); //false
...
module.exports = cluster;

最奇怪的就是从app.js 调用执行master.js 后,尽管NODE_UNIQUE_ID是undefined,但cluster.isMaster却是false???实在想不通。因为isMaster是false, 后面的setupMaster()等操作也无法进行。

现在淘宝npm镜像有人专门维护吗

Viewing all 14821 articles
Browse latest View live