nodejs+mongodb笔记------第一章(node中函数特点、全局global对象、包与包管理器)

1.Node中函数的特点

Node中任何一个模块(js文件)都被一个外层函数所包裹

function (exports, require, module, __filename, __dirname){

}
  exports:用于暴露模块
  require:用于引入模块
  module:用于暴露模块
  __filename:当前文件所在的路径(绝对)
  __dirname:当前文件所在文件夹的路径(绝对)

为什么要有这个外层函数(这个外层函数有什么作用)
1.隐藏内部实现
2.支持commonjs的模块化



2.Node中的global

1.对于浏览器端而言,js由哪几部分组成?

1.BOM 浏览器对象模型 -------- 很多的API(location,history)
2.DOM 文档对象模型 ---------- 很多的API(对DOM的增删改查)
3.ES规范 -------------------- ES5、ES6.....

2.Node端js由几部分组成?

1.没有了BOM -----  因为服务器不需要(服务端没有浏览器对象)
2.没有了DOM -----  因为没有浏览器窗口
3.几乎包含了所有的ES规范
4.没有了window,但是取而代之的是一个叫做global的全局变量。
console.log(global)
// 以下就是控制台输出的结果,global是一个全局对象,里面包含了很多方法属性,我们主要学习一小部分重要和常用的方法,满足工作中的需求
/*
Object [global] {
  DTRACE_NET_SERVER_CONNECTION: [Function],
  DTRACE_NET_STREAM_END: [Function],
  DTRACE_HTTP_SERVER_REQUEST: [Function],
  DTRACE_HTTP_SERVER_RESPONSE: [Function],
  DTRACE_HTTP_CLIENT_REQUEST: [Function],
  DTRACE_HTTP_CLIENT_RESPONSE: [Function],
  COUNTER_NET_SERVER_CONNECTION: [Function],
  COUNTER_NET_SERVER_CONNECTION_CLOSE: [Function],
  COUNTER_HTTP_SERVER_REQUEST: [Function],
  COUNTER_HTTP_SERVER_RESPONSE: [Function],
  COUNTER_HTTP_CLIENT_REQUEST: [Function],
  COUNTER_HTTP_CLIENT_RESPONSE: [Function],
  global: [Circular],
  process:
   process {
     title:
      '管理员: C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe',
     version: 'v10.16.3',
     versions:
      { http_parser: '2.8.0',
        node: '10.16.3',
        v8: '6.8.275.32-node.54',
        uv: '1.28.0',
        zlib: '1.2.11',
        brotli: '1.0.7',
        ares: '1.15.0',
        modules: '64',
        nghttp2: '1.39.2',
        napi: '4',
        openssl: '1.1.1c',
        icu: '64.2',
        unicode: '12.1',
        cldr: '35.1',
        tz: '2019a' },
     arch: 'x64',
     platform: 'win32',
     release:
      { name: 'node',
        lts: 'Dubnium',
        sourceUrl:
         'https://nodejs.org/download/release/v10.16.3/node-v10.16.3.tar.gz',
        headersUrl:
         'https://nodejs.org/download/release/v10.16.3/node-v10.16.3-headers.tar.gz',
        libUrl:
         'https://nodejs.org/download/release/v10.16.3/win-x64/node.lib' },
     argv:
      [ 'C:\\Program Files\\nodejs\\node.exe',
        'C:\\Users\\asus\\Desktop\\node\\复习\\test.js' ],
     execArgv: [],
     env:
      { ALLUSERSPROFILE: 'C:\\ProgramData',
        APPDATA: 'C:\\Users\\asus\\AppData\\Roaming',
        'asl.log': 'Destination=file',
        AWE_DIR:
         'C:\\Program Files (x86)\\Khrona LLC\\Awesomium SDK\\1.6.6\\',
        CommonProgramFiles: 'C:\\Program Files\\Common Files',
        'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files',
        CommonProgramW6432: 'C:\\Program Files\\Common Files',
        COMPUTERNAME: 'DESKTOP-CRC0I9T',
        ComSpec: 'C:\\WINDOWS\\system32\\cmd.exe',
        DriverData: 'C:\\Windows\\System32\\Drivers\\DriverData',
        FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer',
        FPS_BROWSER_USER_PROFILE_STRING: 'Default',
        HOMEDRIVE: 'C:',
        HOMEPATH: '\\Users\\asus',
        LOCALAPPDATA: 'C:\\Users\\asus\\AppData\\Local',
        LOGONSERVER: '\\\\DESKTOP-CRC0I9T',
        NUMBER_OF_PROCESSORS: '8',
        OneDrive: 'C:\\Users\\asus\\OneDrive',
        OS: 'Windows_NT',
        Path:
         'C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\nodejs\\;D:\\前端各类软件\\cmder_mini;C:\\Program Files\\Git\\cmd;C:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code;C:\\Program Files\\MongoDB\\Server\\4.3\\bin;D:\\Program Files (x86)\\KuGou\\KGMusic;C:\\Python27;C:\\Users\\asus\\.windows-build-tools\\python27\\;C:\\Users\\asus\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\asus\\AppData\\Roaming\\npm;C:\\Program Files (x86)\\Thunder Network\\Thunder\\Program;C:\\Program Files\\MongoDB\\Server\\4.3\\bin;',
        PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL',
        PROCESSOR_ARCHITECTURE: 'AMD64',
        PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 158 Stepping 9, GenuineIntel',
        PROCESSOR_LEVEL: '6',
        PROCESSOR_REVISION: '9e09',
        ProgramData: 'C:\\ProgramData',
        ProgramFiles: 'C:\\Program Files',
        'ProgramFiles(x86)': 'C:\\Program Files (x86)',
        ProgramW6432: 'C:\\Program Files',
        PSModulePath:
         'C:\\Users\\asus\\Documents\\WindowsPowerShell\\Modules;C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules',
        PUBLIC: 'C:\\Users\\Public',
        SESSIONNAME: 'Console',
        SystemDrive: 'C:',
        SystemRoot: 'C:\\WINDOWS',
        TEMP: 'C:\\Users\\asus\\AppData\\Local\\Temp',
        TMP: 'C:\\Users\\asus\\AppData\\Local\\Temp',
        USERDOMAIN: 'DESKTOP-CRC0I9T',
        USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-CRC0I9T',
        USERNAME: 'asus',
        USERPROFILE: 'C:\\Users\\asus',
        vscode:
         'C:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code',
        windir: 'C:\\WINDOWS',
        TERM_PROGRAM: 'vscode',
        TERM_PROGRAM_VERSION: '1.45.1',
        LANG: 'zh_CN.UTF-8',
        COLORTERM: 'truecolor',
        VSCODE_GIT_IPC_HANDLE: '\\\\.\\pipe\\vscode-git-acf7697751-sock',
        GIT_ASKPASS:
         'c:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh',
        VSCODE_GIT_ASKPASS_NODE:
         'C:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe',
        VSCODE_GIT_ASKPASS_MAIN:
         'c:\\Users\\asus\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js' },
     pid: 18656,
     features:
      { debug: false,
        uv: true,
        ipv6: true,
        tls_alpn: true,
        tls_sni: true,
        tls_ocsp: true,
        tls: true },
     ppid: 9536,
     execPath: 'C:\\Program Files\\nodejs\\node.exe',
     debugPort: 9229,
     _debugProcess: [Function: _debugProcess],
     _debugEnd: [Function: _debugEnd],
     _startProfilerIdleNotifier: [Function: _startProfilerIdleNotifier],
     _stopProfilerIdleNotifier: [Function: _stopProfilerIdleNotifier],
     abort: [Function: abort],
     chdir: [Function: chdir],
     umask: [Function: umask],
     _getActiveRequests: [Function: _getActiveRequests],
     _getActiveHandles: [Function: _getActiveHandles],
     _kill: [Function: _kill],
     cwd: [Function: cwd],
     dlopen: [Function: dlopen],
     reallyExit: [Function: reallyExit],
     uptime: [Function: uptime],
     _rawDebug: [Function],
     moduleLoadList:
      [ 'Internal Binding module_wrap',
        'Binding contextify',
        'Internal Binding worker',
        'NativeModule events',
        'NativeModule internal/async_hooks',
        'NativeModule internal/errors',
        'Binding uv',
        'Binding buffer',
        'Binding async_wrap',
        'Internal Binding async_wrap',
        'Binding config',
        'Binding icu',
        'NativeModule util',
        'NativeModule internal/util/inspect',
        'Binding util',
        'NativeModule internal/util',
        'Binding constants',
        'Internal Binding types',
        'NativeModule internal/util/types',
        'NativeModule internal/validators',
        'NativeModule internal/encoding',
        'Internal Binding icu',
        'NativeModule buffer',
        'NativeModule internal/buffer',
        'NativeModule internal/process/per_thread',
        'NativeModule internal/process/main_thread_only',
        'NativeModule internal/process/stdio',
        'NativeModule assert',
        'NativeModule internal/assert',
        'NativeModule fs',
        'NativeModule path',
        'NativeModule internal/constants',
        'Binding fs',
        'NativeModule internal/fs/streams',
        'NativeModule internal/fs/utils',
        'NativeModule stream',
        'NativeModule internal/streams/pipeline',
        'NativeModule internal/streams/end-of-stream',
        'NativeModule internal/streams/legacy',
        'NativeModule _stream_readable',
        'NativeModule internal/streams/buffer_list',
        'NativeModule internal/streams/destroy',
        'NativeModule internal/streams/state',
        'NativeModule _stream_writable',
        'NativeModule _stream_duplex',
        'NativeModule _stream_transform',
        'NativeModule _stream_passthrough',
        'NativeModule internal/url',
        'NativeModule internal/querystring',
        'Binding url',
        'NativeModule internal/process/warning',
        'NativeModule internal/process/next_tick',
        'NativeModule internal/process/promises',
        'Internal Binding util',
        'NativeModule internal/fixed_queue',
        'Binding performance',
        'Binding trace_events',
        'NativeModule internal/inspector_async_hook',
        'Binding inspector',
        'NativeModule internal/options',
        'Internal Binding options',
        'NativeModule timers',
        'Binding timer_wrap',
        'NativeModule internal/linkedlist',
        'NativeModule internal/timers',
        'NativeModule console',
        'Binding tty_wrap',
        'Internal Binding tty_wrap',
        'NativeModule tty',
        'NativeModule net',
        'NativeModule internal/net',
        'Binding stream_wrap',
        'Binding tcp_wrap',
        'Binding pipe_wrap',
        'NativeModule internal/stream_base_commons',
        'Internal Binding stream_wrap',
        'Internal Binding uv',
        'NativeModule internal/tty',
        'Binding signal_wrap',
        'NativeModule internal/modules/cjs/loader',
        'NativeModule vm',
        'NativeModule internal/modules/cjs/helpers',
        'NativeModule url',
        'NativeModule internal/safe_globals',
        'Internal Binding contextify',
        'NativeModule os',
        'Binding os' ],
     binding: [Function: binding],
     _linkedBinding: [Function: _linkedBinding],
     _events:
      [Object: null prototype] {
        newListener: [Function],
        removeListener: [Function],
        warning: [Function],
        SIGWINCH: [Array] },
     _eventsCount: 4,
     _maxListeners: undefined,
     _fatalException: [Function],
     domain: null,
     _exiting: false,
     assert: [Function: deprecated],
     config: { target_defaults: [Object], variables: [Object] },
     setUncaughtExceptionCaptureCallback: [Function],
     hasUncaughtExceptionCaptureCallback: [Function],
     emitWarning: [Function],
     nextTick: [Function: nextTick],
     _tickCallback: [Function: _tickCallback],
     stdout: [Getter],
     stderr: [Getter],
     stdin: [Getter],
     openStdin: [Function],
     hrtime: { [Function: hrtime] bigint: [Function] },
     cpuUsage: [Function: cpuUsage],
     memoryUsage: [Function: memoryUsage],
     exit: [Function],
     kill: [Function],
     argv0: 'C:\\Program Files\\nodejs\\node.exe',
     allowedNodeEnvironmentFlags: [Getter/Setter],
     mainModule:
      Module {
        id: '.',
        id: '.',
        exports: {},
        parent: null,
        filename: 'C:\\Users\\asus\\Desktop\\node\\复习\\test.js',
        loaded: false,
        children: [],
        paths: [Array] } },
  Buffer:
   { [Function: Buffer]
     poolSize: 8192,
     from: [Function: from],
     of: [Function: of],
     alloc: [Function: alloc],
     allocUnsafe: [Function: allocUnsafe],
     allocUnsafeSlow: [Function: allocUnsafeSlow],
     isBuffer: [Function: isBuffer],
     compare: [Function: compare],
     isEncoding: [Function: isEncoding],
     concat: [Function: concat],
     byteLength: [Function: byteLength],
     [Symbol(kIsEncodingSymbol)]: [Function: isEncoding] },
  clearImmediate: [Function: clearImmediate],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setImmediate:
   { [Function: setImmediate] [Symbol(util.promisify.custom)]: [Function] },
  setInterval: [Function: setInterval],
  setTimeout:
   { [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] } }
*/

3.包与npm包管理器

  1.什么是包?
      我们电脑上的文件夹,包含了某些特定的文件,符合了某些特定的结构,就是一个包。

  2.一个标准的包,应该包含哪些内容?
      1)    package.json ------- 描述文件(包的 “说明书”,必须要有!!!)
      2)    bin -----------------可执行二进制文件
      3)    lib ---------------- 经过编译后的js代码
      4)    doc ---------------- 文档(说明文档、bug修复文档、版本变更记录文档)
      5)    test --------------- 一些测试报告

  3.如何让一个普通文件夹变成一个包?
        让这个文件夹拥有一个:package.json文件即可,且package.json里面的内容要合法。
        执行命令:npm init
        包名的要求:不能有中文、不能有大写字母、不能与npm仓库上其他包同名。

  4.npm与node的关系?(npm:node package manager)
        安装node后自动安装npm(npm是node官方出的包管理器,专门用于管理包)

  5.npm的常用命令?

      一、【搜索】:
            1.npm search xxxxx
            2.通过网址搜索:www.npmjs.com

      二、【安装】:(安装之前必须保证文件夹内有package.json,且里面的内容格式合法)

            1.npm install xxxxx --save   或   npm i xxxx -S   或   npm i xxxx
                备注:
                (1).局部安装完的第三方包,放在当前目录中node_modules这个文件夹里
                (2).安装完毕会自动产生一个package-lock.json(npm版本在5以后才有),里面缓存的是每个下载过的包的地址,目的是下次安装时速度快一些。
                (3).当安装完一个包,该包的名字会自动写入到package.json中的【dependencies(生产依赖)】里。

            2.npm install xxxxx --save-dev  或  npm i xxxxx -D  安装包并将该包写入到【devDependencies(开发依赖中)】
              备注:什么是生产依赖与开发依赖?

                    1.只在开发时(写代码时)时需要依赖的库,就是开发依赖 ----- 例如:语法检查、压缩代码、扩展css前缀的包。
                    2.在生产环境中必不可少的包,就是生产依赖 ------ 例如:jquery、axios等等。
                      备注:所谓生产环境就是指:项目开发完毕,要部署到服务器上运行。
                    3.某些包即属于开发依赖,又属于生产依赖 -------例如:jquery。

            3.npm i xxxx -g  全局安装xxxx包(一般来说,带有指令集的包要进行全局安装,例如:browserify、babel等)
              查看全局安装的位置:npm root -g

            4.npm i xxx@yyy :安装xxx包的yyy版本

            5.npm i :安装package.json中声明的所有包

      三、【移除】:
            npm remove xxxxx  在node_module中删除xxxx包,并且删除该包在package.json中的声明

      四、【其他命令】:
            1.npm aduit fix :检测项目依赖中的一些问题,并且尝试着修复。

            2.npm view xxxxx versions :查看npm仓库中xxxx包的所有版本信息

            3.npm view xxxxx version :查看npm仓库中xxxx包的最新版本

            4.npm ls xxxx :查看我们所安装的xxxx包的版本

       五、【关于版本号的说明】:
            "^3.x.x" :锁定大版本,以后安装包的时候,保证包是3.x.x版本,x默认取最新的。
            "~3.1.x" :锁定小版本,以后安装包的时候,保证包是3.1.x版本,x默认取最新的。
            "3.1.1" :锁定完整版本,以后安装包的时候,保证包必须是3.1.1版本。

4.cnpm的使用

cnpm的简介与使用

国内使用npm存在的问题

  • 安装npm后,每次我们安装包时,我们的电脑都要和npm服务器进行对话,去npm仓库获取包。

  • npm默认的仓库地址为:http://registry.npmjs.org

  • 查看当前npm仓库地址命令:npm config get registry,提示如下图:

  • 因为npm的远程服务器在国外,所以有时候难免出现访问过慢,甚至无法访问的情况。

  • 为了解决这个问题,我们有以下几个解决办法

使用淘宝的cpm代替npm

淘宝为我们搭建了一个国内的npm服务器,它目前是每隔10分钟将国外npm仓库的所有内容“搬运”回国内的服务器上,这样我们直接访问淘宝的国内服务器就可以了,它的地址是:https://registry.npm.taobao.org

使用方法:

第一种:直接安装cnpm

安装淘宝提供的cnpm,并更改服务器地址为淘宝的国内地址,
命令:npm install -g cnpm --registry=https://registry.npm.taobao.org,以后安装直接采用cpm替代npm
例如原生npm命令为:npm install uniq --save,cnpm命令为:cnpm install uniq --save

第二种:替换npm仓库地址为淘宝镜像地址(推荐)

命令:npm config set registry https://registry.npm.taobao.org
查看是否更改成功:npm config get registry,以后安装时,依然用npm命令,但是实际是从淘宝国内服务器下载的

4.yarn的使用

yarn的简介与使用

Yarn发布于2016年10月,截至当前2019年1月,gitHub上的Start数量为:34.3k,已经超过npm很多了,
yarn使用本地缓存,无需互联网连接就能安装本地已经缓存的依赖项,安装方法:npm install -g yarn

特别注意:

由于yarn的全局安装位置与npm不同,所以要配置yarn的全局安装路径到环境变量中,否则全局安装的包不起作用。
具体操作如下:

安装yarn后执行 yarn global dir命令,获取yarn全局安装位置。
将该位置配置到电脑环境变量中

yarn命令与npm命令的对应关系如下:

初始化项目:

yarn init -y
npm init -y

下载项目的所有声明的依赖:

yarn
npm install

下载指定的运行时依赖包:

yarn add webpack@3.2.1
npm install webpack@3.2.1 -S

下载指定的开发时依赖:

yarn add webpack@3.2.1 -D
npm install webpack@3.2.1 -D

全局下载指定包:

yarn global add webpack
npm install webpack -g

删除依赖包:

yarn remove webpack
npm remove webpack -S
yarn global remove webpack
npm remove webpack -g

运行项目中配置的script:

yarn run xxx
npm run xxx

查看某个包的信息:

yarn info xxx
npm info xxx

设置淘宝镜像:

yarn config set registry https://registry.npm.taobao.org
npm config set registry https://registry.npm.taobao.org
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349