关于window下的node版本管理

【背景】

手头上的项目刚进入内灰阶段,趁现在比较闲的时间,想说安装一下node的版本管理,为了方便后续,闲下来磨刀(摸鱼)的时候方便。使用nvm进行node的版本管理,然鹅,在window下发现还是有点坑的。所以搞定以后还是记录一下。

【一堆废话】

关于node版本管理的好处就不多说了,mac下和Linux下的安装也非常简单,官网上就有。自行查找了。在window下的话,推荐是使用nvm-window和nvmw。一开始选择安装的是前者,但是需要卸载掉原有的node,这个一开始在网上看到是可以在安装的时候将已经安装的node的版本添加进去。行,就它了,一顿疯狂操作,发现并不行。而且看到网上有说部分版本存在问题的。所以后面改装nvmw了。先说下结果,失败了,最后还是卸载了node,安装了nvm-window。nvmw安装是成功的,只是使用上出现了奇奇怪怪的问题。下面具体说说:

【nvmw安装步骤】

一、https://github.com/TimothyGu/nvmw(nvm的地址,可看下安装的前置条件)
二、git clone git://github.com/hakobera/nvmw.git (使用git进行安装)
三、在环境变量path中添加nvmw的安装地址
四、安装完成后,打开一个新的cmd,输入nvmw,能够出现nvmw的相关命令
image.png

是不是很简单?接下来才是填坑的时候!

五、设置淘宝镜像(注意:每次使用,都得重新在命令行中设置,或者改一下他的源码,把这三个变量写死。)
              set "NVMW_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node"
              set "NVMW_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs"
              set "NVMW_NPM_MIRROR=http://npm.taobao.org/mirrors/npm"
或修改nvmw.bat:
              NVMW_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node
              NVMW_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs
修改get_npm.js:
                var NVMW_NPM_MIRROR =” [http://npm.taobao.org/mirrors/npm]

另外修改了淘宝镜像以后,因为我的电脑是64位的,对应的是x64,但是淘宝NPM镜像站和官方镜像站上对应的都是win-x64,所以还需要改两个地方,一个是修改nvmw.bat文件137行,x64改为win-x64,另一个是修改fget.js文件47行,XMLHTTP 更改为ServerXMLHTTP

另外,可能还会出现的一些坑需要注意下:

有可能出现没有扩展“.js”的脚本引擎,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联。

在运行中输入“regedit”进入注册表,只需要把[HKEY_CLASSES_ROOT.js] 项下的那个默认值改成 "JSFile" 就可以正常运行JS 文件了

有可能存在node4.0及以上的出现 node does not include npm的错误

在nvmw目录下新建一个你要安装的node版本名的文件夹。手动下载npm-master.zip并改名为npm.zip后放到这个文件加下,然后修改nvmw.bat文件,重新执行安装命令

附上修改过后的nvmw.bat文件
  @echo off
if not defined NVMW_HOME (
  set "NVMW_HOME=%~dp0"
)
if not defined PATH_ORG (
  set "PATH_ORG=%PATH%"
)
set IS64=FALSE
if exist "%PROGRAMFILES(X86)%" (
  set IS64=TRUE
)
if %IS64% == TRUE (
  set OS_ARCH=x64
) else (
  set OS_ARCH=x32
)
if not defined NVMW_NODEJS_ORG_MIRROR (
  set "NVMW_NODEJS_ORG_MIRROR=https://nodejs.org/dist"
)
if not defined NVMW_IOJS_ORG_MIRROR (
  set "NVMW_IOJS_ORG_MIRROR=https://iojs.org/dist"
)
if "%1" == "install" if not "%2" == "" (
  call :install %2 %3
  if not ERRORLEVEL == 1 call :use %2 %3
  exit /b %ERRORLEVEL%
)
if "%1" == "use" if not "%2" == "" (
  call :use %2 %3
  exit /b %ERRORLEVEL%
)
if "%1" == "ls" (
  call :ls
  exit /b %ERRORLEVEL%
)
if "%1" == "uninstall" if not "%2" == "" (
  call :uninstall %2 %3
  exit /b %ERRORLEVEL%
)
call :help
exit /b %ERRORLEVEL%
::===========================================================
:: help : Show help message
::===========================================================
:help
echo;
echo Node Version Manager for Windows
echo;
echo Usage:
echo   nvmw help                          Show this message
echo   nvmw install [version] [arch]      Download and install a [version]
echo                                        for [arch] architecture (optional)
echo   nvmw uninstall [version]           Uninstall a [version]
echo   nvmw use [version]                 Modify PATH to use [version]
echo   nvmw ls                            List installed versions
echo;
echo Example:
echo   nvmw install v0.10.21        Install a specific version number of node.js
echo   nvmw use v0.10.21            Use the specific version
echo   nvmw install iojs            Install the latest version of io.js
echo   nvmw install iojs-v1.0.2     Install a specific version number of io.js
echo   nvmw use iojs-v1.0.2         Use the specific version io.js
echo;
echo   nvmw install v0.10.35 x86    Install a 32-bit version
exit /b 0
::===========================================================
:: install : Install specified version node and npm
::===========================================================
:install
setlocal
set ARCH=%OS_ARCH%
if not "%2" == "" (
  set ARCH=%2
  :: x86, ia32 alias x32
  if "%2" == "x86" (
    set ARCH=x32
  )
  if "%2" == "ia32" (
    set ARCH=x32
  )
)
set NODE_TYPE=node
set NODE_VERSION=%1
:: nvmw install iojs-v1.0.2
if "%NODE_VERSION:~4,1%" == "-" (
  for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do (
    set NODE_TYPE=%%a
    set NODE_VERSION=%%b
  )
)
:: nvmw install iojs
if %NODE_VERSION% == iojs (
  set NODE_TYPE=iojs
  set NODE_VERSION=latest
)
:: nvmw install node
if %NODE_VERSION% == node (
  set NODE_TYPE=node
  set NODE_VERSION=latest
)
:: iojs-1.0.0, iojs-latest
if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l (
  set NODE_VERSION=v%NODE_VERSION%
)
if %NODE_TYPE% == iojs (
  set DIST_URL=%%
  if %ARCH% == x32 (
    set NODE_EXE_URL=%NVMW_IOJS_ORG_MIRROR%/%NODE_VERSION%/win-x86/iojs.exe
  ) else (
    set NODE_EXE_URL=%NVMW_IOJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/iojs.exe
  )
) else if %NODE_VERSION:~0,1% == 0 (
  if %ARCH% == x32 (
    set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/node.exe
  ) else (
    set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/x64/node.exe
  )
) else (
  if %ARCH% == x32 (
    set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x86/node.exe
  ) else (
    set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/node.exe
  )
)
set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%"
if %NODE_TYPE% == iojs (
  set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%"
)
if not %ARCH% == %OS_ARCH% (
  set "NODE_HOME=%NODE_HOME%-%ARCH%"
)
set "NODE_EXE_FILE=%NODE_HOME%\%NODE_TYPE%.exe"
set "NPM_ZIP_FILE=%NODE_HOME%\npm.zip"
if exist "%NODE_EXE_FILE%" (
  endlocal
  echo "%NODE_TYPE%/%NODE_VERSION% (%ARCH%)" already exists, please uninstall it first
  exit /b 1
)
mkdir "%NODE_HOME%"
echo Start installing %NODE_TYPE%/%NODE_VERSION% (%ARCH%) to %NODE_HOME%
cscript //nologo "%NVMW_HOME%\fget.js" %NODE_EXE_URL% "%NODE_EXE_FILE%"
if not exist "%NODE_EXE_FILE%" (
  echo Download %NODE_EXE_FILE% from %NODE_EXE_URL% failed
  goto install_error
) else (
  if %NODE_TYPE% == iojs (
    copy "%NVMW_HOME%\alias-node.cmd" "%NODE_HOME%\node.cmd"
  )
  echo Start install npm
  "%NODE_EXE_FILE%" "%NVMW_HOME%\get_npm.js" "%NODE_HOME%" "%NODE_TYPE%/%NODE_VERSION%"
  if not exist "%NPM_ZIP_FILE%" goto install_error
  set "CD_ORG=%CD%"
  %~d0
  cd "%NODE_HOME%"
  echo Start unzip "%NPM_ZIP_FILE%" to "%NODE_HOME%"
  cscript //nologo "%NVMW_HOME%\unzip.js" "%NPM_ZIP_FILE%" "%NODE_HOME%"
  mkdir "%NODE_HOME%\node_modules"
  rmdir /s /q "%NODE_HOME%\node_modules\npm"
  move npm-* "%NODE_HOME%\node_modules\npm"
  copy "%NODE_HOME%\node_modules\npm\bin\npm.cmd" "%NODE_HOME%\npm.cmd"
  cd "%CD_ORG%"
  if not exist "%NODE_HOME%\npm.cmd" goto install_error
  echo npm install ok
  echo Finished
  endlocal
  exit /b 0
)
:install_error
  rd /Q /S "%NODE_HOME%"
  endlocal
  exit /b 1
::===========================================================
:: uninstall : Uninstall specified version
::===========================================================
:uninstall
setlocal
set ARCH=%OS_ARCH%
if not "%2" == "" (
  set ARCH=%2
  :: x86, ia32 alias x32
  if "%2" == "x86" (
    set ARCH=x32
  )
  if "%2" == "ia32" (
    set ARCH=x32
  )
)
set NODE_TYPE=node
set NODE_VERSION=%1
if "%NODE_VERSION:~4,1%" == "-" (
  for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do (
    set NODE_TYPE=%%a
    set NODE_VERSION=%%b
  )
)
:: nvmw uninstall iojs
if %NODE_VERSION% == iojs (
  set NODE_TYPE=iojs
  set NODE_VERSION=latest
)
:: nvmw uninstall node
if %NODE_VERSION% == node (
  set NODE_TYPE=node
  set NODE_VERSION=latest
)
if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l (
  set NODE_VERSION=v%NODE_VERSION%
)
if "%NVMW_CURRENT_TYPE%" == "%NODE_TYPE%" if "%NVMW_CURRENT%" == "%NODE_VERSION%" if "%NVMW_CURRENT_ARCH%" == "%ARCH%" (
  echo Cannot uninstall currently-active %NODE_TYPE%/%NODE_VERSION% %ARCH%
  exit /b 1
)
set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%"
if %NODE_TYPE% == iojs (
  set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%"
)
if not %ARCH% == %OS_ARCH% (
  set "NODE_HOME=%NODE_HOME%-%ARCH%"
)
if not exist "%NODE_HOME%" (
  echo %NODE_TYPE%/%NODE_VERSION% %ARCH% is not installed
  exit /b 1
) else (
  rd /Q /S "%NODE_HOME%"
  if ERRORLEVEL == 1 (
    echo Cannot uninstall %NODE_TYPE%/%NODE_VERSION% %ARCH%
    exit /b 1
  ) else (
    echo Uninstalled %NODE_TYPE%/%NODE_VERSION% %ARCH%
    endlocal
    exit /b 0
  )
)
::===========================================================
:: use : Change current version
::===========================================================
:use
setlocal
set ARCH=%OS_ARCH%
if not "%2" == "" (
  set ARCH=%2
  :: x86, ia32 alias x32
  if "%2" == "x86" (
    set ARCH=x32
  )
  if "%2" == "ia32" (
    set ARCH=x32
  )
)
set NODE_TYPE=node
set NODE_VERSION=%1
if "%NODE_VERSION:~4,1%" == "-" (
  for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do (
    set NODE_TYPE=%%a
    set NODE_VERSION=%%b
  )
)
:: nvmw use iojs
if %NODE_VERSION% == iojs (
  set NODE_TYPE=iojs
  set NODE_VERSION=latest
)
:: nvmw use node
if %NODE_VERSION% == node (
  set NODE_TYPE=node
  set NODE_VERSION=latest
)
if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l (
  set NODE_VERSION=v%NODE_VERSION%
)
set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%"
if %NODE_TYPE% == iojs (
  set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%"
)
if not %ARCH% == %OS_ARCH% (
  set "NODE_HOME=%NODE_HOME%-%ARCH%"
)
if not exist "%NODE_HOME%" (
  echo %NODE_TYPE%/%NODE_VERSION% is not installed
  exit /b 1
)
endlocal
set NVMW_CURRENT_ARCH=%OS_ARCH%
if not "%2" == "" (
  set NVMW_CURRENT_ARCH=%2
  :: x86, ia32 alias x32
  if "%2" == "x86" (
    set NVMW_CURRENT_ARCH=x32
  )
  if "%2" == "ia32" (
    set NVMW_CURRENT_ARCH=x32
  )
)
set NVMW_CURRENT_TYPE=node
set NVMW_CURRENT=%1
if "%NVMW_CURRENT:~4,1%" == "-" (
  for /f "tokens=1,2,* delims=-" %%a in ("%NVMW_CURRENT%") do (
    set NVMW_CURRENT_TYPE=%%a
    set NVMW_CURRENT=%%b
  )
)
if %NVMW_CURRENT% == iojs (
  set NVMW_CURRENT_TYPE=iojs
  set NVMW_CURRENT=latest
)
if %NVMW_CURRENT% == node (
  set NVMW_CURRENT_TYPE=node
  set NVMW_CURRENT=latest
)
if not %NVMW_CURRENT:~0,1% == v if not %NVMW_CURRENT:~0,1% == l (
  set NVMW_CURRENT=v%NVMW_CURRENT%
)
echo Now using %NVMW_CURRENT_TYPE% %NVMW_CURRENT% %NVMW_CURRENT_ARCH%
set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%"
if %NVMW_CURRENT_TYPE% == iojs (
  set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%"
)
if not %NVMW_CURRENT_ARCH% == %OS_ARCH% (
  set NVMW_CURRENT_ARCH_PADDING=-%NVMW_CURRENT_ARCH%
) else (
  set NVMW_CURRENT_ARCH_PADDING=
)
if %NVMW_CURRENT_TYPE% == iojs (
  set "PATH=%NVMW_HOME%;%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%"
  set "NODE_PATH=%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules"
) else (
  set "PATH=%NVMW_HOME%;%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%"
  set "NODE_PATH=%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules"
)
exit /b 0
::===========================================================
:: ls : List installed versions
::===========================================================
:ls
setlocal
echo node:
if exist "%NVMW_HOME%" (
  dir "%NVMW_HOME%v*" /b /ad
)
echo;
echo iojs:
if exist "%NVMW_HOME%iojs" (
  dir "%NVMW_HOME%iojs\*" /b /ad
)
echo;
if not defined NVMW_CURRENT (
  set NVMW_CURRENT_V=none
) else (
  set NVMW_CURRENT_V=%NVMW_CURRENT%
)
echo Current: %NVMW_CURRENT_TYPE%/%NVMW_CURRENT_V% %NVMW_CURRENT_ARCH%
endlocal
exit /b 0
当然上面这一步在win10 上面不需要这么麻烦,只需要修改get_npm.js文件43行else包含的内容修改为下面的代码就行了
var pkgUri = "https://npm.taobao.org/mirrors/node/index.json";
wget(pkgUri, function (filename, pkg) {
    if (filename === null) {
        return noNpmAndExit();
    }
    var _pkg = JSON.parse(pkg);
    for(var i = 0,n=_pkg.length;i<n;i++){
      var obj = _pkg[i];
         if(obj.version == binVersion){
            downloadNpmZip(obj.npm);
        }
    }
  });
到这里基本上就可以正常使用nvmw了,然鹅,我还是遇到了比如说下面这些奇奇怪怪的问题导致最后还是用了nvm-window

安装9.9.0版本的可以正常使用,但是安装最新的10.15.1,安装提示成功了,但是打开文件夹一看是空的。使用nvmw切换版本又是成功的。


2019-02-25_200851.png

安装9.9.0是成功的,提示也是没有出现任何问题,但是10.15.1的版本就出现提示找不到文件夹路径了,另一个程序正在使用此文件,进程无法访问,网上有人说出现这个提示是其实是成功的,我试了下,是可以切换到10.15.1的,但是node -v提示不是内部命令


2019-02-25_200831.png

nvmw list 显示是已经有两个版本的node了,但是只有9.9.0是可以正常使用的。
另外发现的一个问题是,nvmw use指定版本以后,每次重启,当前使用的node版本都显示为none,很是不爽,网上没找到跟我有相同情况的人,所以也没有相应的解决方案,所以不得不放弃。转nvm-window。

nvm-window的安装

这个安装基本上就没有太多的难度和问题了,直接把原本安装的node全部卸载干净,然后去github上下载最新版的安装包 【地址: https://github.com/coreybutler/nvm-windows/releases

  • nvm-noinstall.zip: 这个是绿色免安装版本,但是使用之前需要配置
  • nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。

安装的时候注意路径不要包含空格和中文,原默认的路径是C:\Program File\nodejs,把空格改掉就行了。
安装完成后在命令行使用nvm,如果出现nvm版本号和一系列帮助指令,则说明nvm安装成功。(我的电脑上在cmd上输入命令提示不是内部命令或外部命令,但是用PowerShell是OK的。【补充,重启后发现是正常的,后面定位了问题,是因为我电脑上安装了wox这个插件,需要把wox重启一下】)

修改淘宝镜像

在你安装的目录下找到settings.txt文件,打开后加上

node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/

nvm相关命令

  • nvm arch [32|64]: 显示node是运行在32位还是64位模式。指定32或64来覆盖默认体系结构。
  • nvm install <version> [arch]:该可以是node.js版本或最新稳定版本latest。(可选[arch])指定安装32位或64位版本(默认为系统arch)。设置[arch]为all以安装32和64位版本。在命令后面添加–insecure,可以绕过远端下载服务器的SSL验证。
  • nvm list [available]:列出已经安装的node.js版本。可选的available,显示可下载版本的部分列表。这个命令可以简写为nvm ls [available]。
  • nvm on: 启用node.js版本管理。
  • nvm off: 禁用node.js版本管理(不卸载任何东西)
  • nvm proxy [url]: 设置用于下载的代理。留[url]空白,以查看当前的代理。设置[url]为none删除代理。
  • nvm node_mirror [url]:设置node镜像,默认为https://nodejs.org/dist/.。可以设置为淘宝的镜像https://npm.taobao.org/mirrors/node/
  • nvm npm_mirror [url]:设置npm镜像,默认为https://github.com/npm/npm/archive/。可以设置为淘宝的镜像https://npm.taobao.org/mirrors/npm/
  • nvm uninstall <version>: 卸载指定版本的nodejs。
  • nvm use [version] [arch]: 切换到使用指定的nodejs版本。可以指定32/64位[arch]。
  • nvm use <arch>:将继续使用所选版本,但根据提供的值切换到32/64位模式
  • nvm root [path]: 设置 nvm 存储node.js不同版本的目录 ,如果未设置,将使用当前目录。
  • nvm version: 显示当前运行的nvm版本,可以简写为nvm v
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容